并发,std::thread
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));