C++11 并发指南二(std::thread 详解)
上一篇博客《C++11 并发指南一(C++11 多线程初探)》中只是提到了 std::thread 的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍 std::thread 的用法。
std::thread 在 <thread> 头文件中声明,因此使用 std::thread 时需要包含 <thread> 头文件。
std::thread 构造
default (1) |
thread() noexcept; |
---|---|
initialization (2) |
template <class Fn, class... Args> explicit thread (Fn&& fn, Args&&... args); |
copy [deleted] (3) |
thread (const thread&) = delete; |
move (4) |
thread (thread&& x) noexcept; |
- (1). 默认构造函数,创建一个空的 thread 执行对象。
- (2). 初始化构造函数,创建一个 thread对象,该 thread对象可被 joinable,新产生的线程会调用 fn 函数,该函数的参数由 args 给出。
- (3). 拷贝构造函数(被禁用),意味着 thread 不可被拷贝构造。
- (4). move 构造函数,move 构造函数,调用成功之后 x 不代表任何 thread 执行对象。
- 注意:可被 joinable 的 thread 对象必须在他们销毁之前被主线程 join 或者将其设置为 detached.
std::thread 各种构造函数例子如下(参考):
#include <iostream> #include <utility> #include <thread> #include <chrono> #include <functional> #include <atomic>void f1(int n) {for (int i = 0; i < 5; ++i) {std::cout << "Thread " << n << " executing\n";std::this_thread::sleep_for(std::chrono::milliseconds(10));} }void f2(int& n) {for (int i = 0; i < 5; ++i) {std::cout << "Thread 2 executing\n";++n;std::this_thread::sleep_for(std::chrono::milliseconds(10));} }int main() {int n = 0;std::thread t1; // t1 is not a threadstd::thread t2(f1, n + 1); // pass by valuestd::thread t3(f2, std::ref(n)); // pass by referencestd::thread t4(std::move(t3)); // t4 is now running f2(). t3 is no longer a threadt2.join();t4.join();std::cout << "Final value of n is " << n << '\n'; }
move 赋值操作
move (1) |
thread& operator= (thread&& rhs) noexcept; |
---|---|
copy [deleted] (2) |
thread& operator= (const thread&) = delete; |
- (1). move 赋值操作,如果当前对象不可 joinable,需要传递一个右值引用(rhs)给 move 赋值操作;如果当前对象可被 joinable,则 terminate() 报错。
- (2). 拷贝赋值操作被禁用,thread 对象不可被拷贝。
请看下面的例子:
#include <stdio.h> #include <stdlib.h>#include <chrono> // std::chrono::seconds #include <iostream> // std::cout #include <thread> // std::thread, std::this_thread::sleep_for void thread_task(int n) {std::this_thread::sleep_for(std::chrono::seconds(n));std::cout << "hello thread "<< std::this_thread::get_id()<< " paused " << n << " seconds" << std::endl; }/** === FUNCTION =========================================================* Name: main* Description: program entry routine.* ========================================================================*/ int main(int argc, const char *argv[]) {std::thread threads[5];std::cout << "Spawning 5 threads...\n";for (int i = 0; i < 5; i++) {threads[i] = std::thread(thread_task, i + 1);}std::cout << "Done spawning threads! Now wait for them to join\n";for (auto& t: threads) {t.join();}std::cout << "All threads joined.\n";return EXIT_SUCCESS; } /* ---------- end of function main ---------- */
其他成员函数
- get_id
- 获取线程 ID。
- joinable
- 检查线程是否可被 join。
- join
- Join 线程。
- detach
- Detach 线程
- swap
- Swap 线程 。
- native_handle
- 返回 native handle。
- hardware_concurrency [static]
- 检测硬件并发特性。
C++11 并发指南二(std::thread 详解)相关推荐
- 【C/C++开发】C++11 并发指南二(std::thread 详解)
上一篇博客<C++11 并发指南一(C++11 多线程初探)>中只是提到了 std::thread 的基本用法,并给出了一个最简单的例子,本文将稍微详细地介绍 std::thread 的用 ...
- C++11 并发指南三(std::mutex 详解)
上一篇<C++11 并发指南二(std::thread 详解)>中主要讲到了 std::thread 的一些用法,并给出了两个小例子,本文将介绍 std::mutex 的用法. Mutex ...
- 【转】C++11 并发指南五(std::condition_variable 详解)
http://www.cnblogs.com/haippy/p/3252041.html 前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三 ...
- C++11 并发指南五(std::condition_variable 详解)
前面三讲<C++11 并发指南二(std::thread 详解)>,<C++11 并发指南三(std::mutex 详解)>分别介绍了 std::thread,std::mut ...
- C++11 并发指南六( atomic 类型详解二 std::atomic )
C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍) 一文介绍了 C++11 中最简单的原子类型 std::atomic_flag,但是 std::atomic_flag ...
- C++11 并发指南六(atomic 类型详解三 std::atomic (续))
C++11 并发指南六( <atomic> 类型详解二 std::atomic ) 介绍了基本的原子类型 std::atomic 的用法,本节我会给大家介绍C++11 标准库中的 std: ...
- C++11 并发指南六(atomic 类型详解四 C 风格原子操作介绍)
前面三篇文章<C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)>.<C++11 并发指南六( <atomic> 类型详解二 std::at ...
- C++11 并发指南六(atomic 类型详解一 atomic_flag 介绍)
C++11 并发指南已经写了 5 章,前五章重点介绍了多线程编程方面的内容,但大部分内容只涉及多线程.互斥量.条件变量和异步编程相关的 API,C++11 程序员完全可以不必知道这些 API 在底层是 ...
- C++11 并发指南------std::thread 详解
参考: https://github.com/forhappy/Cplusplus-Concurrency-In-Practice/blob/master/zh/chapter3-Thread/Int ...
最新文章
- Bilateral Filtering(双边滤波) for SSAO(转)
- 跨平台的.NET邮件协议MailKit组件解析
- Android之解决toolbar里面显示返回按钮图片太大和没有水平居中的问题
- 2-sat模板- 输出可行解
- QOTD:Java线程与Java堆空间
- PAT乙类之1011 A+B 和 C
- zjoi 2008 树的统计——树链剖分
- Python中selenium的玩法,小朋友看了都说学会了
- 【概率笔记】这些概率公理性质你需要会的呀
- LINUX:lpr不能打印,可以试试lp
- MFC 驱动加载工具(安装/运行/停止/卸载)
- linux系统中的软件管理(软件仓库的搭建:本地+网络源+第三方)
- 计算大数阶乘--VB Script 版
- 【错误记录】安卓项目编译报错 ( offline mode 错误 )
- java设置铃声_Android来电铃声默认设置的实现方法与如何设置语音来电的默认铃声...
- 从今以后我一个人唱悲伤情歌:伤感的QQ空间日志
- 高频功率放大器输出为什么会有高次谐波
- 利用Excel Power Query获取基金历史净值、估值和日增长率等信息
- 用python画小鸭,Python 处理输入法字库(五笔极点字库转小鸭字库)
- 爬虫系列,(4),playwright使用说明
热门文章
- java集合按大小排序_JAVA中对List根据map某个key值从小到大顺序进行排序
- 2019年大数据发展趋势预测
- mysql如何计算qps_如何计算MySQL中的QPS及TPS指标
- 这个保守的 RNA motif是病毒侵染的关键
- Python学习之路和隐藏特征
- 每天一个实用小技巧!教你在Mac上快速输入长文本
- 不容错过!我的Mac装机软件清单,Mac新手看过来!
- python -v乱码提示,#import....等信息的问题解决方式。
- 哪个学校既教计算机教英语翻译,教学计算机专业的英语翻译.doc
- ios开发跳转safari_iOS 跳转网页的四种方法