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正在被破坏的场景.
是的。如果复制失败,它将抛出构造线程。
\n\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
| 归档时间: |
|
| 查看次数: |
695 次 |
| 最近记录: |