2013-01-03 60 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它。