有了一定的语法基础,对于用法,直接参考官方文档是最可靠和直接的,对于实践,要么自寻探索,要么假借他人。————我说的
https://en.cppreference.com/w/cpp/thread
#mermaid-svg-6ytogLtY1yDLHIMx {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-6ytogLtY1yDLHIMx .error-icon{fill:#552222;}#mermaid-svg-6ytogLtY1yDLHIMx .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-6ytogLtY1yDLHIMx .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-6ytogLtY1yDLHIMx .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-6ytogLtY1yDLHIMx .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-6ytogLtY1yDLHIMx .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-6ytogLtY1yDLHIMx .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-6ytogLtY1yDLHIMx .marker{fill:#333333;stroke:#333333;}#mermaid-svg-6ytogLtY1yDLHIMx .marker.cross{stroke:#333333;}#mermaid-svg-6ytogLtY1yDLHIMx svg{font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-6ytogLtY1yDLHIMx defs #statediagram-barbEnd{fill:#333333;stroke:#333333;}#mermaid-svg-6ytogLtY1yDLHIMx g.stateGroup text{fill:#9370DB;stroke:none;font-size:10px;}#mermaid-svg-6ytogLtY1yDLHIMx g.stateGroup text{fill:#333;stroke:none;font-size:10px;}#mermaid-svg-6ytogLtY1yDLHIMx g.stateGroup .state-title{font-weight:bolder;fill:#131300;}#mermaid-svg-6ytogLtY1yDLHIMx g.stateGroup rect{fill:#ECECFF;stroke:#9370DB;}#mermaid-svg-6ytogLtY1yDLHIMx g.stateGroup line{stroke:#333333;stroke-width:1;}#mermaid-svg-6ytogLtY1yDLHIMx .transition{stroke:#333333;stroke-width:1;fill:none;}#mermaid-svg-6ytogLtY1yDLHIMx .stateGroup .composit{fill:white;border-bottom:1px;}#mermaid-svg-6ytogLtY1yDLHIMx .stateGroup .alt-composit{fill:#e0e0e0;border-bottom:1px;}#mermaid-svg-6ytogLtY1yDLHIMx .state-note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-6ytogLtY1yDLHIMx .state-note text{fill:black;stroke:none;font-size:10px;}#mermaid-svg-6ytogLtY1yDLHIMx .stateLabel .box{stroke:none;stroke-width:0;fill:#ECECFF;opacity:0.5;}#mermaid-svg-6ytogLtY1yDLHIMx .edgeLabel .label rect{fill:#ECECFF;opacity:0.5;}#mermaid-svg-6ytogLtY1yDLHIMx .edgeLabel .label text{fill:#333;}#mermaid-svg-6ytogLtY1yDLHIMx .label div .edgeLabel{color:#333;}#mermaid-svg-6ytogLtY1yDLHIMx .stateLabel text{fill:#131300;font-size:10px;font-weight:bold;}#mermaid-svg-6ytogLtY1yDLHIMx .node circle.state-start{fill:#333333;stroke:#333333;}#mermaid-svg-6ytogLtY1yDLHIMx .node .fork-join{fill:#333333;stroke:#333333;}#mermaid-svg-6ytogLtY1yDLHIMx .node circle.state-end{fill:#9370DB;stroke:white;stroke-width:1.5;}#mermaid-svg-6ytogLtY1yDLHIMx .end-state-inner{fill:white;stroke-width:1.5;}#mermaid-svg-6ytogLtY1yDLHIMx .node rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6ytogLtY1yDLHIMx .node polygon{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6ytogLtY1yDLHIMx #statediagram-barbEnd{fill:#333333;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-cluster rect{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-6ytogLtY1yDLHIMx .cluster-label,#mermaid-svg-6ytogLtY1yDLHIMx .nodeLabel{color:#131300;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-cluster rect.outer{rx:5px;ry:5px;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-state .divider{stroke:#9370DB;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-state .title-state{rx:5px;ry:5px;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-cluster.statediagram-cluster .inner{fill:white;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-cluster.statediagram-cluster-alt .inner{fill:#f0f0f0;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-cluster .inner{rx:0;ry:0;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-state rect.basic{rx:5px;ry:5px;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-state rect.divider{stroke-dasharray:10,10;fill:#f0f0f0;}#mermaid-svg-6ytogLtY1yDLHIMx .note-edge{stroke-dasharray:5;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-note rect{fill:#fff5ad;stroke:#aaaa33;stroke-width:1px;rx:0;ry:0;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-note text{fill:black;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram-note .nodeLabel{color:black;}#mermaid-svg-6ytogLtY1yDLHIMx .statediagram .edgeLabel{color:red;}#mermaid-svg-6ytogLtY1yDLHIMx #dependencyStart,#mermaid-svg-6ytogLtY1yDLHIMx #dependencyEnd{fill:#333333;stroke:#333333;stroke-width:1;}#mermaid-svg-6ytogLtY1yDLHIMx :root{--mermaid-font-family:"trebuchet ms",verdana,arial,sans-serif;}
调用休眠函数
休眠时间到期
等待某个事件
事件发生
任务完成或被强制结束
新建
就绪
等待操作系统分配时间
休眠
阻塞
结束
PS:使用noexcept表明函数或操作不会发生异常,会给编译器更大的优化空间。
一、类模板std::thread及对应成员函数简介使用C++11线程库前需引用头文件#include
。
thread() noexcept;//since c++11
thread(thread&& other) noexcept;//since c++11
template
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
,将右侧线程资源移动至左边。注意,被赋值的线程应该处于无关联状态,否则将会抛出异常。
观察器是线程的成员函数:
观察器含义joinable检查线程是否处于joinable状态get_id返回线程的idnative_handle返回一个底层实现线程句柄hardware_concurrency返回一个最大并发线程数- joinable 用于判断线程是否处于joinnable状态
- get_i 当前线程的id编号
- native_handle 线程调度相关
- hardware_concurreny 硬件支持的最大并发数
unsigned int n = std::thread::hardware_concurrency();
void swap(thread &lhs,thread &rhs) noexcept;
等效于成员函数版的swap