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));