Ber*_*ard 2 c++ multithreading memory-barriers
考虑一下这段代码(从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();
});
Run Code Online (Sandbox Code Playgroud)
HttpServer::default_resource是一个std :: unordered_map,根据我的理解,它不是线程安全的. port是一张未签约的短片.
假设我的C++内存栅栏的理解是正确的,server通过新的线程中看到的,可能不是一个有效的状态为主线可能不会写的变化port,并default_resource从其他线程访问内存.因此,server.start()可能无法正常工作.
要解决这个问题,我必须通过添加到atomic_thread_fences 来更改代码:
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();
});
Run Code Online (Sandbox Code Playgroud)
我的理解是否正确,是否有atomic_thread_fence必要?
30.3.1.2线程构造函数
Run Code Online (Sandbox Code Playgroud)template <class F, class ...Args> explicit thread(F&& f, Args&&... args);同步:构造函数的调用完成与调用副本的开始同步
f.
换句话说:当线程函数被调用时,它与父线程中发生的所有内容同步,直到std::thread在父线程中构造.
不需要这种明确的记忆障碍/围栏.