std::thread 简介
std::thread 用来定义一个线程对象,并管理与之关联的执行线程。
说明
可以借助 thread 对象来观察和管理应用程序中的执行线程。使用默认构造函数创建的线程对象不与任何可执行线程关联;而通过传入一个可调用对象来构造线程对象时,就会启动一个新的执行线程,并在其中调用这个可调用对象。线程对象只能移动,不能复制,因此一个执行线程只能与唯一一个线程对象绑定。
每个可执行线程都拥有一个唯一的 thread::id 标识符。函数 this_thread::get_id 返回当前调用线程的标识符;成员函数 thread::get_id 则返回线程对象所管理线程的标识符。对于默认构造出的线程对象,thread::get_id 返回的值对所有此类对象都是相同的;而 this_thread::get_id 在任一可被 join 的执行线程中调用时,返回的值都与之不同。
常用成员函数
.
函数
detach()//分离thread对象关联的线程,不受thread的管理,如果不join ,而且不调用detach 那么线程将会出错,thread不会自动释放资源
join()//阻塞线程,直到返回
get_id()//返回关联的线程唯一标示
基本用法示例
.
void func_1()
{
cout<<"hello std::thread"<<endl;
}
int main(int argc, char *argv[])
{
auto t = std::thread(func_1);
t.detach();
auto t1 = std::thread([&]()
{
cout<<"hello 11"<<endl;
});
t1.join();
system("pause");
return 0;
}
在 Visual Studio 中打开线程监视窗口,可以观察到每个线程都拥有独立的函数调用栈。
参考 MSDN:https://msdn.microsoft.com/zh-cn/library/hh920601(v=vs.120).aspx
创建线程组
如果需要批量创建并等待多个线程,可以把线程对象存入 std::vector,最后统一 join。
std::vector<std::thread> workers;
for (int i = 0; i < 20; i++)
{
auto t = std::thread([]
{
Sleep(10);
cout << __FUNCTION__ << endl;
});
workers.push_back(std::move(t));
}
//遍历容器,依次调用join等待线程返回
std::for_each(workers.begin(), workers.end(), std::mem_fn(&std::thread::join));