将参数移动到std :: thread中?

时间:2015-09-07 18:00:00

标签: c++ multithreading c++11 thread-safety c++14

请考虑以下代码:

void h(M m2) 
{ 
    ...
}

int main()
{
  while (true) {
    M m1 = ...;
    std::thread t(h, std::move(m1));
    t.detach();
  }
}

是否保证m2正确move - 在m1被销毁之前从m1构建?还是有比赛?

1 个答案:

答案 0 :(得分:4)

标准对我来说似乎很清楚:

  

效果:构造一个类型为thread的对象。新的执行线程执行INVOKE (DECAY_COPY ( std::forward<F>(f)), DECAY_COPY (std::forward<Args>(args))...)调用   DECAY_COPY在构造线程中进行评估。

由于副本是在调用线程中完成的,因此它必须在构造函数调用返回之前完成。

m2的构建是从另一个对象(DECAY_COPY的结果)完成的,而不是来自m1,因此m1是否已被销毁或者无关紧要不

DECAY_COPY的结果必须由实现存储在某处,以便在目标函数初始化之前它不会超出范围,但这是实现的正确工作。 m1的销毁对它没有任何影响。