ve(t3); //在这次转移之时,t1已经关联运行some_other_function的线程,因此std::thread的析构函数中会调用std::terminate(),终止整个程序。所以只要std::thread对象还在管控着一个线程,就不能简单地向它赋新值。
因为std::thread
支持移动语义,所以只要容器同样知悉移动意图,就可以装载std::thread
对象。因此我们可以写出下列代码,生成多个线程,然后等待它们运行完成。
void do_work(unsigned id);
void foo()
{
std::vector<std::thread> threads;
for (unsigned i = 0; i < 20; ++i)
{
threads.push_back(std::thread(do_work, i));
}
for (auto& entry : threads)
{
entry.join();
}
}
4、识别线程
使用C++标准库的std::thread::hardware_concurrency()
函数可以获取系统中逻辑处理器的数量。如果信息无法获取,该函数可能返回0。
线程ID的类型是std::thread::id
,它有两种获取方法:
- 在与线程关联的
std::thread
对象上调用成员函数get_id()
,即可得到该线程的ID。如果std::thread
对象没有关联任何执行线程,则调用get_id()
返回的是按默认构造方式生成的std::thread::id
对象,表示“线程不存在”。
- 当前线程的ID可以通过调用
std::this_thread::get_id()
获取。
std::thread::id
对象可以支持很多种操作:
- 可随意进行复制操作或比较运算。
- 可用作关联容器(
std::set
、std::map
、std::multiset
、std::multimap
)的键值,无序关联容器(std::unordered_set
、std::unordered_map
、std::unordered_multiset
、std::unordered_multimap
)的键值,或用于排序。
- 写到输出流,例如
std::cout << std::this_thread::get_id();
。