1

boost::asio HTTP Server 3 の例の Connection クラスのコードを参照しますhttp://www.boost.org/doc/libs/1_49_0/doc/html/boost_asio/example/http/server3/connection.cpp

各非同期操作が boost::asio::io_service::strand で呼び出されていることがわかります。これにより、完了ハンドラが同時に呼び出されなくなります。ただし、サンプル サーバーは io_service::run を呼び出す複数のスレッドで実行できます。つまり、これらのスレッドのいずれかを使用してハンドラーを呼び出すことができます。この例のハンドラーはすべて、boost::asio::ip::tcp::socket オブジェクトのメソッドを呼び出します。私にとって、これはスレッド間でソケット オブジェクトを共有することです (ただし、同時にメソッドを呼び出すわけではありません)。

ソケット呼び出しの周りに同期が見られないので、質問は、各スレッドがソケット オブジェクトの状態について同じビューを持つことを保証するためにどのようなメカニズムが配置されているかということです。ドキュメントには、boost::asio::ip::tcp::socket のインスタンスを共有することは安全でないと明確に記載されています。

4

1 に答える 1

0

ドキュメントには、tcp::socket は共有オブジェクトとしてスレッド セーフではないことが記載されています。

私は、広く受け入れられているスレッド セーフのSGI STL定義を使用します。

STL の SGI 実装は、個別のコンテナーへの同時アクセスが安全であり、共有コンテナーへの同時読み取りアクセスが安全であるという意味でのみ、スレッドセーフです。複数のスレッドが 1 つのコンテナーにアクセスし、少なくとも 1 つのスレッドが書き込みを行う可能性がある場合、ユーザーは、コンテナーへのアクセス中にスレッド間の相互排除を保証する責任があります。

キーワードは同時です。そのため、複数のスレッドを使用して共有オブジェクトにアクセスしても、そのアクセスが同時でない限り問題ありません。余談ですが、これは、1 つ以上のスレッドが共有オブジェクトに書き込みを行っている場合にのみ問題になります。

ソケット オブジェクトの状態は、スレッド間で共有されるプロセスのメモリ空間にあるため、矛盾することはありません。

これがあなたの質問に答えることを願っています!

于 2012-06-05T19:25:06.963 に答える