5

非同期 TCP 通信に boost::asio を使用すると、多くの (3-4) 内部スレッドが開始されることに気付きました。ドキュメントを読むと、それは言う

"The implementation of this library for a particular platform may 
 make use of one or more internal threads to emulate asynchronicity"

現在、私のライブラリには、余分なスレッドを開始しないという非常に厳しい要件があります(クライアントによって提供され、現在開始されているスレッドを除くio_service::run())。boost::asio がこれらの余分なスレッドを作成するのを止める方法はありますか?

あるいは、1 つのスレッドだけで実行できる非同期ライブラリは他にありますか?

4

2 に答える 2

7

BOOST_ASIO_DISABLE_THREADS適切な変換単位で定義することにより、エミュレートされた非同期操作のサポートを無効にできます。ドキュメントには、定義について次のように書かれています

Boostが全体としてスレッドをサポートしているかどうかに関係なく、Boost.Asioのスレッドサポートを明示的に無効にします。

プラットフォーム固有の実装ノートが見つからなかった場合は、このエミュレーションを使用する操作が明確に示されています。たとえば、ほぼすべてのプラットフォームasync_resolve()でこの方法でエミュレートされていることを知っています。スレッドは、の最初の呼び出し時に作成されますasync_resolve()。一部の(すべて?)Windowsプラットフォームは、操作などの他のいくつかの操作をエミュレートしdeadline_timerます。

スレッドサポートを無効にする代わりの方法の1つは、これらのエミュレートされた操作を回避することです。私は個人的にBOOST_ASIO_DISABLE_THREADSプロジェクトで使用したことがないので、他の副作用があるかどうかはわかりません。

于 2013-02-20T15:15:52.063 に答える
1

特定のプラットフォームでスレッドが生成されるかどうかを実際にテストしましたか? 何もない場合、問題は解決しました! ある場合は、libevent や libev などの別のライブラリを検討してください。それらのいずれか、または Qt などのさまざまなライブラリによって提供される他の非同期イベント ループ全体が機能する可能性があります。

于 2013-02-20T13:59:57.540 に答える