std :: thread参数的生命周期

new*_*int 7 c++ multithreading stl c++11

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

简单的例子:

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

我应该自动假设在f()结束之前所有数据都是安全复制的吗?我看到的其中一个场景,假设f()不等待,并且向前全力以赴,th就是试图复制array正在被破坏的场景.

ron*_*nag 4

是的。如果复制失败,它将抛出构造线程。

\n\n
\n

\xc2\xa730.3.1.2 线程构造函数

\n\n

模板显式线程(F&& f, Args&&...\n args);

\n\n

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

\n\n

作用:构造一个线程类型的对象。新的执行线程执行 INVOKE (DECAY_-\n COPY ( std::forward(f)), DECAY_COPY (std::forward(args))...)\n , 并在构造线程中评估对 DECAY_COPY 的调用。此调用的任何返回值都将被忽略。[ 注意:\n 这意味着调用 f 的副本时未抛出的任何异常都将在构造线程中抛出,而不是在 new\n 线程中。\xe2\x80\x94end note ] 如果 INVOKE (DECAY_COPY (\n std::forward(f)), DECAY_COPY (std::forward(args))...)\n 的调用因未捕获的异常而终止,std ::terminate 将被调用。

\n\n

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

\n
\n