【发布时间】:2013-01-03 22:38:52
【问题描述】:
如果您在std::thread 和主线程(或任何其他线程)之间有共享变量,即使您在创建线程后立即执行thread::detach() 方法,您仍然可以访问这些共享变量吗?
【问题讨论】:
标签: c++ multithreading c++11
如果您在std::thread 和主线程(或任何其他线程)之间有共享变量,即使您在创建线程后立即执行thread::detach() 方法,您仍然可以访问这些共享变量吗?
【问题讨论】:
标签: c++ multithreading c++11
是的!调用detach() 后,仍然可以访问全局、捕获和传入的变量。
但是,如果您正在调用 detach,很可能您希望从创建线程的函数中返回,从而允许线程对象超出范围。如果是这种情况,您必须注意该函数的任何本地变量都没有通过引用或指针传递给线程。
您可以将detach() 视为线程不需要创建线程的任何本地内容的声明。
在以下示例中,一个线程在超出范围后继续访问起始线程堆栈上的int。这是未定义的行为!
void start_thread()
{
int someInt = 5;
std::thread t([&]() {
while (true)
{
// Will print someInt (5) repeatedly until we return. Then,
// undefined behavior!
std::cout << someInt << std::endl;
}
});
t.detach();
}
这里有一些可能的方法来防止地毯从你的线下被扫出:
int 在任何需要它的线程的生命周期内都不会超出范围(可能是全局的)。std::shared_ptr 并将其按值传递到线程中。【讨论】:
是的。分离线程只是意味着它在完成后会自行清理,您不再需要也不允许join它。
【讨论】: