线程类无法正常工作

thread class doesn't work properly

本文关键字:工作 常工作 线程      更新时间:2023-10-16

与线程和并行编程有关

我看到了一个关于线程的问题,该问题是由某人回答的。我尝试了他回答的代码并写了。我尝试了

   #include <iostream>
   #include <thread>
   using namespace std;
   void printx()
   {
    cout << "Hello world!!!!"<< endl;
    cout << "Hello world!!!!"<< endl; 
    cout << "Hello world!!!!"<< endl; 
    cout << "Hello world!!!!"<< endl;  
   }
   int main(){
    cout << "Hello world!!!!"<< endl; 
    thread t1(printx);
    //t1.join();
    t1.detach();
    cout << "Hello world!!!!"<< endl; 
   t1.join();
   return 0;
   }

我收到了输出为

你好世界!!!

仅印刷一次我不明白是否应该更多的次数

您需要了解线程的一些基本概念:

thread.detach()
将执行线程与线程对象分开,从而使执行能够独立继续。线程退出后,任何分配的资源将被释放。

如果两个线程都具有相同的thread id,则两个线程是"可加入的"。一旦您称为join方法或detach方法,它就会变成"不可加工"。!

问题

您首先称为thread.detach(),将线程与主线程分开。然后,您再次尝试使用join,这将出现错误,因为两个线程分开并且具有不同的thread id

解决方案

使用join或使用detach。不要使用两者。

  1. JOIN
    函数在执行线程完成后返回。

      void printx()
       {
         cout << "In thread"<< endl;
       }
      int main()
      {
        cout << "Before thread"<< endl; 
        thread t1(printx);
        t1.join();
        cout << "After Thread"<< endl; 
        return 0;
    }
    
  2. 分离
    分开两个线程的执行。

    void printx()
    {
        cout << "In thread"<< endl;
    }
    int main()
    {
        cout << "Before thread"<< endl; 
        thread t1(printx);
        t1.detach();
        cout << "After Thread"<< endl; 
        return 0;
    }
    

参考:

  • 加入
  • 分离