Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/160.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 启动Boost线程时的保证_C++_Windows_Boost_Boost Thread - Fatal编程技术网

C++ 启动Boost线程时的保证

C++ 启动Boost线程时的保证,c++,windows,boost,boost-thread,C++,Windows,Boost,Boost Thread,我正在使用Boost和Visual Studio 2013 启动Boost线程时是否有内存保证?我希望得到如下保证: 对线程的start()调用发生在已启动线程中的任何操作之前 在本例中,我希望创建一个(非线程安全的)TCP客户端,然后启动一个接收方线程: struct Connection { boost::shared_ptr<TcpClient> client; }; auto client = boost::shared_ptr<TcpClient>{n

我正在使用Boost和Visual Studio 2013

启动Boost线程时是否有内存保证?我希望得到如下保证:

对线程的start()调用发生在已启动线程中的任何操作之前

在本例中,我希望创建一个(非线程安全的)TCP客户端,然后启动一个接收方线程:

struct Connection {
    boost::shared_ptr<TcpClient> client;
};

auto client = boost::shared_ptr<TcpClient>{new TcpClient};
client->setTimeouts(60 * 1000, 60 * 1000);
client->connect(host, port);

auto connection = boost::shared_ptr<Connection>{new Connection};
connection->client = client;

auto receiverThread = boost::shared_ptr<thread>{new thread([&connection]() {
  // can I access the client safely?
  while (connection->client->isConnected()) {
    // do receiving stuff
  }
})};
struct连接{
boost::共享的ptr客户端;
};
自动客户端=boost::shared_ptr{new TcpClient};
客户端->设置超时(60*1000,60*1000);
客户端->连接(主机、端口);
自动连接=boost::共享{新连接};
连接->客户端=客户端;
auto-receiverThread=boost::shared_ptr{新线程([&connection](){
//我可以安全地访问客户端吗?
同时(连接->客户端->断开连接(){
//收东西吗
}
})};

是对
客户端的更改,即。E超时,主机和端口,在启动的线程中可见?

是。线程之前不存在,因此它不能有“过时”值(例如,在寄存器中)。CreateThread之前的所有写入对新线程可见


底层操作系统功能充当隐含的内存屏障(
CreateThread
e.g.)

另见,例如:



<强>侧注释:< /强>考虑按值捕获<代码>连接< /代码>共享指针。这就是共享指针的全部意义,共享所有权

有趣的问题。实际上,可能是的,但我在boost中找不到明确的保证。在c++11库中,release/acquire是一种保证。“底层操作系统功能充当隐含的内存屏障”。引文?@n.m.虽然我也想看一些明确的文档,但我认为可以肯定地说,
CreateThread
如果不包含至少一个内存屏障,就无法正确执行其功能。(我想你可能会在假设的未来平台上遇到麻烦,在这些平台上,内存障碍只适用于特定的地址。)@HarryJohnston虽然有道理,但这对我来说并不明显,我也找不到权威文档来解释这一点。该页面有一个简短的“使用适当的屏障来确保内存顺序的同步功能”列表,但
CreateThread
不在其中。我希望这个答案能更详细地阐述这个语句,并提供一些参考。@dxiv,我的推理是调度程序必须将有关新线程的信息传递给将要运行它的内核,我无法想象如果没有内存障碍,如何可靠地完成这项工作。我同意这是一个不能令人满意的论点。我们知道线程条目是序列化的(请参阅DllMain的文档),如果此序列化是使用关键部分完成的,那么这将确保内存按照链接到的页面排序。不幸的是,我认为我们不能保证加载程序锁实际上是一个关键部分。无论它使用什么样的同步原语,就内存排序而言,可能都相当于一个关键部分,但这仍然是我的猜测。