c ++并发操作中的线程执行示例

时间:2014-08-04 07:36:59

标签: c++ multithreading

以下代码是c ++并发操作中的作用域线程示例。但是我在xcode5.1中运行这个例子时有一个问题,因为Scoped_thread t是它的析构函数的连接,t的析构函数是在线程main()的末尾运行的吗?所以无论我有多长时间的main()线程睡眠,主要的输出都在t输出之前,但答案不是?有谁能帮我解释一下?

#include <iostream>
#include <algorithm>
#include <thread>
#include <chrono>

using namespace std;



struct Scoped_thread
{
  std::thread sthread;

  Scoped_thread(std::thread tmp):sthread(std::move(tmp))
  {
    if (!sthread.joinable())
    {
        cout<<"error on contructor a scoped thread"<<endl;
    }
  }

 ~Scoped_thread()
 {
    sthread.join();
 }

     Scoped_thread(Scoped_thread& tmp) = delete;
     Scoped_thread& operator =(const Scoped_thread& tmp) = delete;
}; 

void hello_scoped_thread()
{
    cout<<"this is scoped thread output"<<endl;
}

int main()
{
    Scoped_thread t((std::thread(hello_scoped_thread)));
   //std::this_thread::sleep_for(std::chrono::seconds(10));

   cout<<"this is in main thread"<<endl;

   return 0;

}

编辑加:我想知道主线程已知t线程何时加入,当主要做破坏t? /在编译器解析代码或者像这样的时候?

1 个答案:

答案 0 :(得分:0)

线程以异步方式运行,因此不应过多关注线程与main之间的操作顺序。这些操作通常尽可能快地完成,因此当1个线程等待时,其他线程可以继续。

作用域线程类只需要注意主线程等待,直到新线程在作用域结束时结束,这是main()函数的结束,通过加入。