考虑这个代码(由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
小号有必要吗?
由线程初始化之前排序的父线程执行的所有操作必须从刚刚创建的线程的角度完成。因此,在这种情况下,由于服务器在调用'std :: thread :: thread()'之前已经初始化,所以不需要线程围栏。 –
看来你正在将实际线程(并发概念)与线程处理程序对象(一个C++对象)混淆。 –