以下代码是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? /在编译器解析代码或者像这样的时候?
答案 0 :(得分:0)
线程以异步方式运行,因此不应过多关注线程与main之间的操作顺序。这些操作通常尽可能快地完成,因此当1个线程等待时,其他线程可以继续。
作用域线程类只需要注意主线程等待,直到新线程在作用域结束时结束,这是main()
函数的结束,通过加入。