如果您之间有共享变量std::thread
和主线程(或任何其他线程),即使您执行thread::detach()
创建线程后立即调用方法?
是的!调用后仍然可以访问全局变量、捕获变量和传入变量detach() http://en.cppreference.com/w/cpp/thread/thread/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 http://en.cppreference.com/w/cpp/memory/shared_ptr并将其按值传递到线程中。
- 按值传递(执行复制)到线程中。
- 将右值引用(执行移动)传递到线程中。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)