水木社区手机版
首页
|版面-C++程序设计语言(CPlusPlus)|
新版wap站已上线
返回
1/1
|
转到
主题:[心得] 脉络分析:第2章 线程管理《C++并发编程实战》
楼主
|
CyberPunker
|
2021-04-10 16:33:11
|
展开
第二章 线程管理
2.1 基本线程管理
2.1.1 启动线程
1. 给线程构造函数传递一个函数对象
问题:析构问题
解决办法:1.通过命名函数对象来避免
a. 括号避免解释成函数声明
b. 用大括号
2. 使用lambda方式
2.
线程的完成问题
:等待其完成或让它自动运行。
若不等待:
问题: 确保通过线程访问的数据有效,直到线程完成。———— 单线程也存在的情况
新的情形:线程函数持有局部变量的指针或引用,函数退出时线程尚未完成
解决办法:让线程函数“自包含”,把数据拷贝而不是共享。
或者使用join等待线程执行完毕,引出下一小节:
2.1.2 等待线程完成
主线程使用join()等待线程完成,
问题: 但要这样做的话,多线程机就没意义了。
解决办法:进行更细颗粒的控制,
替代机制:条件变量和future ———— 第四章
2.1.3 异常环境下等待
问题: 线程开始之后,join之前,发生问题,join被跳过
解决办法:try-catch
缺点:啰嗦,容易弄乱作用域
解决办法: RAII,
在析构函数中进行join
拷贝构造函数和拷贝赋值运算符被标记为delete
若无须等待,采用detaching ,引出下一小节。
2.1.4 在后台运行线程
把所有权和控制权交给C++运行库。
极端情况:即用即忘
传递参数给线程函数,引出下一小节。
2.2 传递参数给线程函数
默认方式: 复制
情况1: 传递指针
问题:在转换过程中推出,引发未定义行为
解决办法:在传递之前完成转换。
情况2:对象被复制,但实际要的是引用。
解决办法:使用std::ref 来包装
情况3:使用std::bind机制
情况4:参数不能被复制,只能被移动
使用std::move机制
2.3 转移线程的所有权
由来:两种情形
1. 创建后台线程,向调用函数回传新线程的所有权,而不是等待它完成。
2. 反过来,创建新线程,把所有权给等待它完成的函数。
本质?资源是movable的,但非copyable的 ,比如 std::thread 就是其中之一
意味着:
好处:
还考虑了 std::thread对象的容器
—————— 迈向线程自动管理的一步。
引出下一小节。
2.4 在运行时选择线程数量
std::thread::hardware_currency()得到并发的线程数量
例子:
根据并发线程数量来分解计算。
结果的问题: future ,第四章
需要表示线程,引出下一小节。
2.5 标识线程
两种方式:
1. std::thread对象调用 get_id()
2. std::this_thread::get_id()
作用:
1. 用来检查一个线程是否需要执行某些操作
2. 作为操作的一部分存储在数据结构中
3. 可以指定的数据需要一个线程进行关联
2.6 小结
--
修改:CyberPunker FROM 203.218.252.*
FROM 203.218.252.*
2楼
|
CyberPunker
|
2021-04-16 21:44:33
|
展开
何出此言?
原版烂?翻译的烂?
【 在 mvtec 的大作中提到: 】
: 这本烂书
: 实在不值得
:
--
FROM 203.218.252.*
5楼
|
CyberPunker
|
2021-04-17 12:57:17
|
展开
那主要是比较老了呗
【 在 mvtec 的大作中提到: 】
: 这部书不推荐是因为
: 1. memory order没有解释清楚
: 2. 有些东西都已经不用或者过时了。
: ...................
--
FROM 203.218.252.*
6楼
|
CyberPunker
|
2021-04-17 13:01:57
|
展开
我觉得这样的问题应该是属于另外一个层面了,
理解完线程以后,再递进的看这些tip
【 在 here080 的大作中提到: 】
: 问题太多,别的不说,我就指出一个:不要用std::bind
:
https://abseil.io/tips/108
--
FROM 203.218.252.*
1/1
|
转到
选择讨论区
首页
|
分区
|
热推
BYR-Team
©
2010.
KBS Dev-Team
©
2011
登录完整版