将参数移到std :: thread中?

And*_*zos 1 c++ multithreading thread-safety c++11 c++14

请考虑以下代码:

void h(M m2) 
{ 
    ...
}

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

是否可以保证-d从之前构造的m2正确被销毁?还是有种族?movem1m1

Jon*_*ely 5

我觉得这个标准很明确:

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

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

的构造m2是从其他对象(DECAY_COPY的结果)完成的,而不是从进行的m1,因此是否m1已销毁无关紧要。

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