使用临时对象初始化线程

时间:2019-03-14 07:29:58

标签: c++ multithreading initialization move object-lifetime

使用临时线程对象初始化线程是否错误,该对象可能在线程执行期间超出范围?

在下面给出的程序中,我尝试了下面给出的2种方法,并且两种方法都可以正常运行。

#include<thread>
using namespace std;

void consumer()
{
  for(;;)
   {}
}

int main()
{
  thread t[5];

  for(int i=0;i<5;i++)
  {
    /*
      * Method 1
      t[i]=std::thread(consumer);
    */

    /*
     * Method 2
     thread local(consumer);
     t[i]=std::move(local);
    */

     t[i].detach();
   }
   while(1)
    {}
   return 0;
}

1 个答案:

答案 0 :(得分:2)

两种方法都能正常工作。

更准确地说,operator=在两种情况下都执行移动。因此,已创建线程的状态将保留在t[i]中,并且在分配后,临时线程(情况1)或local(情况2)都设置为默认构造的线程,该线程在结束时可能会死亡语句(情况1)或退出块(情况2)。