我正在使用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
的更改,是吗?即超时,主机和端口,在启动的线程中可见?
答案 0 :(得分:2)
是。线程并不存在于之前,所以它不会有陈旧的#34;值(例如在寄存器中)。 CreateThread之前的所有写操作都对新线程可见。
底层操作系统功能充当隐含的内存屏障(Random rand = new Random();
int rnd = rand.nextInt(14) + 6;
例如。)。
另见,例如:C++ - Should data passed to a thread be volatile?
旁注:考虑按值捕获CreateThread
共享指针。这是分享所有权的共享指针的重点。