代码之家  ›  专栏  ›  技术社区  ›  Vishal Sharma

使用临时对象初始化线程

  •  0
  • Vishal Sharma  · 技术社区  · 6 年前

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

    在下面给出的程序中,我尝试了下面给出的两种方法,它们都没有任何错误地运行。

    #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;
    }
    
    0 回复  |  直到 6 年前
        1
  •  2
  •   Christophe    6 年前

    两种方法都很有效。

    更准确地说, operator= 在两种情况下都执行移动。所以创建的线程的状态保持在 t[i] 在任务完成后,临时的(案例1)或 local (case 2)被设置为默认构造的线程,当结束语句(case 1)或退出块(case2)时,该线程可能会死掉。