您当前的位置: 首页 >  c++

我什么都布吉岛

暂无认证

  • 4浏览

    0关注

    292博文

    0收益

  • 0浏览

    0点赞

    0打赏

    0留言

私信
关注
热门博文

C++11线程库 (一) 构造函数及其成员

我什么都布吉岛 发布时间:2019-02-28 17:47:54 ,浏览量:4

有了一定的语法基础,对于用法,直接参考官方文档是最可靠和直接的,对于实践,要么自寻探索,要么假借他人。————我说的

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

1.1 std::thread的构造和析构
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,将右侧线程资源移动至左边。注意,被赋值的线程应该处于无关联状态,否则将会抛出异常。

1.3 观察器

观察器是线程的成员函数:

观察器含义joinable检查线程是否处于joinable状态get_id返回线程的idnative_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

关注
打赏
1658157489
查看更多评论
立即登录/注册

微信扫码登录

0.0421s