有了一定的语法基础,对于用法,直接参考官方文档是最可靠和直接的,对于实践,要么自寻探索,要么假借他人。————我说的
https://en.cppreference.com/w/cpp/thread
PS:使用noexcept表明函数或操作不会发生异常,会给编译器更大的优化空间。
一、类模板std::thread及对应成员函数简介
使用C++11线程库前需引用头文件#include <thread>
。
1.1 std::thread的构造和析构
thread() noexcept;//since c++11
thread(thread&& other) noexcept;//since c++11
template<class Function,class ...Args>
explicit thread(Function &&f,Args && ...args);//since c++11
thread(const thread&)=delete;//since c++11
~thread(); //(since C++11)
std::thread有不代表任何线程的默认构造函数,也有函数对象和参数的构造函数。注意,线程可以被移动,但是不能拷贝构造。如果一个线程对象在析构的时候仍然与某个线程关联,那么系统将会调用std::terminate()
抛出异常,哪些情况析构不会抛出异常?
- 默认构造
- 移动后
- join
- detach
一个线程在结束其生命周期时,线程若处于无关联状态的(也就是上面四种情况)不会抛出异常,其他情况,将会抛出异常。
1.2 移动赋值运算符operator=
thread &operator=(thread&& other)noexcept; (since C++11)
从定义可以看出,赋值语句将会调用std::move
,将右侧线程资源移动至左边。注意,被赋值的线程应该处于无关联状态,否则将会抛出异常。
1.3 观察器
观察器是线程的成员函数:
观察器 | 含义 |
---|---|
joinable | 检查线程是否处于joinable状态 |
get_id | 返回线程的id |
native_handle | 返回一个底层实现线程句柄 |
hardware_concurrency | 返回一个最大并发线程数 |
- joinable 用于判断线程是否处于joinnable状态
- get_i 当前线程的id编号
- native_handle 线程调度相关
- hardware_concurreny 硬件支持的最大并发数
unsigned int n = std::thread::hardware_concurrency();
1.4 操作
操作 | 含义 |
---|---|
join | 等待线程执行完毕 |
detach | 允许线程从线程句柄独立执行 |
swap | 交换两个线程对象 |
1.5 非成员函数
void swap(thread &lhs,thread &rhs) noexcept;
等效于成员函数版的swap