2016-06-22 13 views
0

バックグラウンドスレッドでboost::asio::io_service.run()を実行します。だから私がそれを必要とするときpost()funcに。boost :: asio :: io_service.post()バックグラウンドスレッドのメモリ使用率

int main(int /*argc*/, char** /*argv*/) 
{ 
    std::string message = "hello"; 

    logg = new logger_client(filename,ip,13666); 
    logg->start(); 

    while (true) 
     logg->add_string(message); 

    return 0; 
} 

そしてlogger_clientからいくつかの関連のfuncs:

std::auto_ptr<boost::asio::io_service::work> work; 

logger_client::logger_client(std::string& filename,std::string& ip, uint16_t port) : work(new boost::asio::io_service::work(io_service)) 
{ 
} 

void logger_client::start() 
{ 
    ios_thread = new boost::thread(boost::bind(&io_service.run,&io_service)); 
} 

void print_nothing() 
{ 
    printf("%s\n","lie"); 
} 

void logger_client::add_string(std::string& message) 
{ 
    io_service.post(boost::bind(print_nothing)); 
    //io_service.post(strand->wrap(boost::bind(&logger_client::add_string_imp,this,message))); 
    //io_service.run(); 
} 

私はこれを実行すると、私のプログラムが2GBが分未満食べる

これはメインFUNCです。無限の作業を削除してこれに変更すると:

void logger_client::add_string(std::string& message) 
{ 
    io_service.post(boost::bind(print_nothing)); 
    //io_service.post(strand->wrap(boost::bind(&logger_client::add_string_imp,this,message))); 
    io_service.run(); 
} 

プログラムはうまくいきます。しかし、私はこの(メイン)スレッドで非同期操作を呼びたくはありません。何が間違っているのですか?

UPDATE

私はもはや成長している間(真)ループとメモリに睡眠(1秒)を添加していません。しかし、これは解決策ではありません。なぜなら、post()の後にrun()を呼び出すと(つまり、ハンドルを処理するためにメインスレッドを使用する)、さらに5つのスレッドをwhile(真)ループで追加するとメモリが増えないからです。なぜメインスレッドは新しく作成されたスレッドよりもはるかに優れていますか?私もio_service :: runのスレッドプールを試しました。

+0

メモリリーク(またはリークではない無限のメモリ使用)がBoostコードにあると思われる理由は何ですか?あなたのロガークライアントのようなデバッグコードはあなたの仕事ではなくStackOverflowです。 –

+0

私はpost()で文字列をコメントし、メモリは伸びません – alebaster

+0

真ん中にブーストがあり、ロガークライアントが文字列を受け取るとメモリが増加します。したがって、ロガークライアントはメモリを使用します。クリア –

答えて

2

io_service.run 保留中の操作がない限り、を終了します。

したがって、ios_threadはすぐに終了します。

解決策は、io_service::workを使用することです。また

、この

while (true) 
     logg->add_string(message); 

のような無限ループのスパムは多分少しそれを遅くし、制御の下でそれを維持するために、いくつかの睡眠を()を追加し、良いアイデアではありません。

+0

しかし、私はio_serviceを手動stop()を必要とするのと同じように動作させると思ったので、決して終了しません。また、私は仕事(io_service)を使用しようとしましたが、それは助けにはなりませんでした。 – alebaster

+0

これを読んで:http://stackoverflow.com/questions/17156541/why-do-we-need-to-use-boostasioio-servicework –

+0

ありがとう、私はすでに少しの研究をしましたが、これは私を助けません – alebaster

関連する問題