バックグラウンドスレッドで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のスレッドプールを試しました。
メモリリーク(またはリークではない無限のメモリ使用)がBoostコードにあると思われる理由は何ですか?あなたのロガークライアントのようなデバッグコードはあなたの仕事ではなくStackOverflowです。 –
私はpost()で文字列をコメントし、メモリは伸びません – alebaster
真ん中にブーストがあり、ロガークライアントが文字列を受け取るとメモリが増加します。したがって、ロガークライアントはメモリを使用します。クリア –