将参数移动到std::线程中

Moving an argument into a std::thread?

本文关键字:线程 std 参数 移动      更新时间:2023-10-16

请考虑以下代码:

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

m1被破坏之前,能否保证m2是由m1构建的正确的move -d ?还是有比赛?

这个标准在我看来很清楚:

Effects:构造一个线程类型的对象。新的执行线程执行INVOKE (DECAY_COPY ( std::forward<F>(f)), DECAY_COPY (std::forward<Args>(args))...)并调用DECAY_COPY正在构造线程中求值。

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

m2的构造是从另一个对象(DECAY_COPY的结果)完成的,而不是从m1完成的,因此m1是否被销毁无关紧要。

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