std :: thread参数的生命周期

时间:2013-11-15 07:16:20

标签: c++ multithreading c++11 stl

当参数传递给std::thread()时,生成新线程的线程是否会等到所有参数完全复制到新的线程本地存储中?

简单示例:

void f()
{  
  int array[10];
  ........ //done something with array  
  std::thread th(someF, array); //assuming that someF accepts int[]  
  th.detach();  
}

f()结束之前,我是否应该自动假设所有数据都已安全复制? 我看到的其中一个场景,假设f()没有等待,并且正在全力推进,那就是th正在尝试复制正在销毁的array

2 个答案:

答案 0 :(得分:4)

是。如果它无法复制,它将抛出构造线程。

  

§30.3.1.2线程构造函数

     

模板显式线程(F& f,Args&& ...   参数);

     

要求: F和Args中的每个Ti应满足   MoveConstructible要求。 INVOKE(DECAY_- COPY(   std :: forward(f)),DECAY_COPY(std :: forward(args))...)   (20.8.2)应为有效表达。 4

     

效果:构造一个对象   类型线程。新的执行线程执行INVOKE(DECAY_-   COPY(std :: forward(f)),DECAY_COPY(std :: forward(args))...)   在构造线程中对DECAY_COPY的调用进行评估。此调用的任何返回值都将被忽略。 [ 注意:   这意味着从f的副本调用中抛出的任何异常都将在构造线程中抛出,而不是新的   螺纹即可。 -end note]如果调用INVOKE(DECAY_COPY(   std :: forward(f)),DECAY_COPY(std :: forward(args))...)   以未捕获的异常终止,应调用std :: terminate。

     

同步: 完成调用   构造函数与调用的开始同步   f。

的副本

答案 1 :(得分:3)

是的,如果无法复制参数,那么对于新线程可用的存储,它将引发异常。

来自http://en.cppreference.com/w/cpp/thread/thread/thread

  

评估和复制/移动期间抛出的任何异常   参数在当前线程中抛出,而不是新线程。