は、このコード(Simple-Web-Serverから抽出されたが、ライブラリーの知識は、この質問に答えるために必要はありません)考えてみましょう:メモリフェンスはここに必要ですか?
HttpServer server;
thread server_thread;
server.config.port = 8080;
server.default_resource["GET"] = [](shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request) {
string content = "Hello world!"
*response << "HTTP/1.1 200 OK\r\nContent-Length: " << content.size() << "\r\n\r\n" << content;
};
server_thread = thread([&server]() {
server.start();
});
HttpServer::default_resource
のstd :: unordered_mapで、私の理解には、されていません、スレッドセーフです。 port
は符号なしのshortです。メインスレッドが他のスレッドからアクセス可能なメモリにport
とdefault_resource
への変更を書かれていない可能性がありますよう
新しいスレッドで見られるように、C++のメモリフェンスの私の理解は、server
正しいと仮定すると、有効な状態ではない可能性があります。そのため、server.start()
が正しく動作しない可能性があります。
HttpServer server;
thread server_thread;
server.config.port = 8080;
server.default_resource["GET"] = [](shared_ptr<HttpServer::Response> response, shared_ptr<HttpServer::Request> request) {
string content = "Hello world!"
*response << "HTTP/1.1 200 OK\r\nContent-Length: " << content.size() << "\r\n\r\n" << content;
};
atomic_thread_fence(memory_order_release);
server_thread = thread([&server]() {
atomic_thread_fence(memory_order_acquire);
server.start();
});
が私の理解は正しいです、そして両方atomic_thread_fence
秒必要です。この問題を解決するには
、私はatomic_thread_fence
秒に追加することで、コードを変更する必要がありますか?
スレッドの初期化前に親スレッドによって実行されるすべての操作は、作成されたばかりのスレッドの観点から完了している必要があります。したがってこの場合、サーバが 'std :: thread :: thread()'の呼び出しの前に初期化されているので、スレッドフェンスは必要ありません。 –
スレッドハンドラオブジェクト(C++オブジェクト)と実際のスレッド(同時実行のコンセプト)を混同しているようです。 –