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