2013-01-03 31 views

回答

16

是的!在调用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并将其按值传递给线程。
  • 按值传递(执行副本)到线程中。
  • 将rvalue引用(执行移动)传递到线程中。
5

是的。拆线只是意味着当它完成后它清理完毕,你不再需要,也不允许它,join它。