线程类无法正常工作

时间:2017-12-02 06:41:01

标签: c++ multithreading c++11

涉及线程和并行编程

我在线程上看到了一个被某人回答的问题。我尝试了他回答的代码并写下了。 我试过了

   #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;
   }

我收到的输出为

Hello world !!!!

只打印过一次 我不明白 不应该是更多的次数

1 个答案:

答案 0 :(得分:2)

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

  

thread.detach()
将执行线程与线程对象分开,允许执行独立继续。一旦线程退出,任何已分配的资源都将被释放。

如果两个线程都具有相同的thread id,则它们是“可加入的”。一旦您调用join方法或detach方法,它就变为“不可加入”。

问题

您首先调用了thread.detach(),这将线程与主线程分开。然后你再次尝试join它将给出错误,因为两个线程无法连接,因为它们是分开的并且具有不同的thread id

解决方案

使用join或使用detach。不要同时使用它们。

  1. 加入
    当线程执行完成时,函数返回。

      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;
    }
    
  3. 参考文献: