13

如果您在 astd::thread和主线程(或任何其他线程)之间有共享变量,即使您thread::detach()在创建线程后立即执行该方法,您仍然可以访问这些共享变量吗?

4

2 回答 2

19

是的!调用后仍然可以访问全局、​​捕获和传入的变量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需要它的任何线程的生命周期内不会超出范围的地方(可能是全局的)。
  • 将共享数据声明为 astd::shared_ptr并将其按值传递给线程。
  • 按值(执行副本)传递到线程中。
  • 将右值引用(执行移动)传递到线程中。
于 2013-01-03T23:00:21.453 回答
6

是的。分离线程只是意味着它在完成后自行清理,您不再需要,也不允许join这样做。

于 2013-01-03T22:44:15.900 回答