11

boost::asio::io_service基本的なスレッドプールとして使用しています。一部のスレッドがio_serviceに追加され、メインスレッドがハンドラーの投稿を開始し、ワーカースレッドがハンドラーの実行を開始し、すべてが終了します。ここまでは順調ですね; シングルスレッドコードよりも高速化されています。

ただし、メインスレッドには何百万もの投稿があります。そして、ワーカースレッドが処理できるよりもはるかに高速に、それらを投稿し続けます。私はRAMの制限に達していませんが、それでも多くのことをキューに入れるのはちょっとばかげています。私がやりたいのは、ハンドラーキューのサイズを固定し、キューがいっぱいの場合はpost()ブロックを設定することです。

BoostASIOドキュメントにこれに関するオプションはありません。これは可能ですか?

4

4 に答える 4

2

セマフォを使用してハンドラーのキュー サイズを修正しています。次のコードは、このソリューションを示しています。

void Schedule(boost::function<void()> function)
{
    semaphore.wait();
    io_service.post(boost::bind(&TaskWrapper, function));
}

void TaskWrapper(boost::function<void()> &function)
{
    function();
    semaphore.post();
}
于 2012-08-19T00:17:35.687 に答える
0

ストランド オブジェクトを使用してイベントを配置し、メインに遅延を配置できますか? すべての作業が投稿された後、プログラムは脱落していますか? その場合は、作業オブジェクトを使用して、io_service がいつ停止するかをより詳細に制御できます。

いつでもスレッドの状態を主にチェックし、いずれかが解放されるまで待機させることができます。

//リンク

http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/reference/io_service__strand.html

http://www.boost.org/doc/libs/1_40_0/doc/html/boost_asio/reference/io_service.html

//example from the second link
boost::asio::io_service io_service;
boost::asio::io_service::work work(io_service);

お役に立てれば。

于 2012-07-27T10:25:26.420 に答える