并发,std::thread

梦想游戏人
目录:
现代C++

std::thread  定义一个线程对象,并管理关联的线程

备注:

你可以使用 thread 对象来观察和管理在应用程序中的执行线程。 使用默认的构造函数创建的线程对象不与任何可执行线程关联。 通过使用一个可调用对象的线程对象创建一个执行线程,并在该线程对象中调用这个可调用对象。 线程对象可以被移动,但不能被复制。 因此,一个执行线程只能与一个线程对象关联。

每个可执行线程都具有唯一 thread::id标识符。 函数 this_thread::get_id 返回调用线程的标识符。 成员函数 thread::get_id 返回可由线程对象管理的线程的标识符。 对于默认构造函数创建的线程对象,thread::get_id 方法返回一个对象,该对象具有和所有默认构造函数线程对象相同的值,但 this_thread::get_id 方法返回在调用时可以加入的任何执行线程的值是不同的。

.
函数
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;
}

打开VS 的线程监视窗口可以看出 每个线程都有独立的函数调用栈

参考MSDN。https://msdn.microsoft.com/zh-cn/library/hh920601(v=vs.120).aspx

创建线程组

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