这里需要内存栅栏吗?
Are memory fences required here?
考虑这段代码(摘自 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
是一个无符号短整数。
假设我对 C++ 内存栅栏的理解是正确的,server
,正如新线程所看到的,可能不处于有效状态,因为主线程可能没有将更改写入 port
和 default_resource
到可从其他线程访问的内存。因此,server.start()
可能无法正常工作。
要解决此问题,我必须通过添加到 atomic_thread_fence
s:
来更改代码
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
都是必要的吗?
30.3.1.2 thread constructors
template <class F, class ...Args>
explicit thread(F&& f, Args&&... args);
Synchronization: The completion of the invocation of the constructor
synchronizes with the beginning of the invocation of the copy of f
.
换句话说:当线程函数被调用时,它与父线程中发生的一切同步,直到 std::thread
在父线程中构造。
不需要这种明确的记忆barriers/fences。
考虑这段代码(摘自 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
是一个无符号短整数。
假设我对 C++ 内存栅栏的理解是正确的,server
,正如新线程所看到的,可能不处于有效状态,因为主线程可能没有将更改写入 port
和 default_resource
到可从其他线程访问的内存。因此,server.start()
可能无法正常工作。
要解决此问题,我必须通过添加到 atomic_thread_fence
s:
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
都是必要的吗?
30.3.1.2 thread constructors
template <class F, class ...Args> explicit thread(F&& f, Args&&... args);
Synchronization: The completion of the invocation of the constructor synchronizes with the beginning of the invocation of the copy of
f
.
换句话说:当线程函数被调用时,它与父线程中发生的一切同步,直到 std::thread
在父线程中构造。
不需要这种明确的记忆barriers/fences。