启动Boost线程时保证

时间:2016-01-26 12:34:11

标签: c++ windows boost boost-thread

我正在使用Boost和Visual Studio 2013 don't supports the C++ 11 memory model

启动Boost线程时是否有内存保证?我在Java Language Specification 17.4.5中寻找保证:

  

在启动线程中的任何操作之前,对线程的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
  }
})};

client的更改,是吗?即超时,主机和端口,在启动的线程中可见?

1 个答案:

答案 0 :(得分:2)

是。线程并不存在于之前,所以它不会有陈旧的#34;值(例如在寄存器中)。 CreateThread之前的所有写操作都对新线程可见。

底层操作系统功能充当隐含的内存屏障(Random rand = new Random(); int rnd = rand.nextInt(14) + 6; 例如。)。

另见,例如:C++ - Should data passed to a thread be volatile?

旁注:考虑按值捕获CreateThread共享指针。这是分享所有权的共享指针的重点。