7

将参数传递给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正在被破坏的东西。

4

2 回答 2

4

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

§30.3.1.2 线程构造函数

模板显式线程(F&& f, Args&&... 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 的副本未抛出的任何异常都将在构造线程中抛出,而不是在新线程中。—尾注] 如果 INVOKE (DECAY_COPY (std::forward(f)), DECAY_COPY (std::forward(args))...) 的调用以未捕获的异常终止,则应调用 std::terminate。

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

于 2013-11-15T07:26:05.153 回答
3

是的,如果无法将参数复制到新线程可用的存储空间,它将引发异常。

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

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

于 2013-11-15T07:24:37.947 回答