作者:
[英] 安东尼·威廉姆斯
出版社: 人民邮电出版社
出品方: 异步图书
原作名: C++ Concurrency in Action
译者: 吴天明
出版年: 2021-11-1
页数: 393
定价: 139.80元
装帧: 平装
ISBN: 9787115573551
出版社: 人民邮电出版社
出品方: 异步图书
原作名: C++ Concurrency in Action
译者: 吴天明
出版年: 2021-11-1
页数: 393
定价: 139.80元
装帧: 平装
ISBN: 9787115573551
内容简介 · · · · · ·
本书从C++标准程序库的各种工具讲起,介绍线程管控、在线程间共享数据、并发操作的同步、C++内存模型和原子操作等内容。同时,本书还介绍基于锁的并发数据结构、无锁数据结构、并发代码,以及高级线程管理、并行算法函数、多线程应用的测试和除错。
本书还通过附录及线上资源提供丰富的补充资料,以帮助读者更完整、细致地掌握C++并发编程的知识脉络。本书适合需要深入了解C++多线程开发的读者,以及使用C++进行各类软件开发的开发人员、测试人员,还可以作为C++线程库的参考工具书。
作者简介 · · · · · ·
安东尼·威廉姆斯(Anthony Williams)
C++开发者、顾问、培训师,英国标准协会C++标准组成员,拥有超过20年的C++开发经验,独立编写或合著了众多C++标准委员会文件,为C++11标准引入了线程库,实现了工具“just::thread Pro”(Just Software Solutions公司的产品),并持续致力于开发C++的新特性,以增强C++并发工具集的功能,这两者都遵循C++标准和提案。
目录 · · · · · ·
第1章 你好,C++并发世界
1.1 什么是并发
1.1.1 计算机系统中的并发
1.1.2 并发的方式
1.1.3 并发与并行
1.2 为什么使用并发技术
1.2.1 为分离关注点而并发
1.2.2 为性能而并发:任务并行和数据并行
1.2.3 什么时候避免并发
1.3 并发与C++多线程
1.3.1 C++多线程简史
1.3.2 新标准对并发的支持
1.3.3 C++14和C++17进一步支持并发和并行
1.3.4 标准C++线程库的效率
1.3.5 平台专属的工具
1.4 启程上路
1.5 小结
第2章 线程管控
2.1 线程的基本管控
2.1.1 发起线程
2.1.2 等待线程完成
2.1.3 在出现异常的情况下等待
2.1.4 在后台运行线程
2.2 向线程函数传递参数
2.3 移交线程归属权
2.4 在运行时选择线程数量
2.5 识别线程
2.6 小结
第3章 在线程间共享数据
3.1 线程间共享数据的问题
3.1.1 条件竞争
3.1.2 防止恶性条件竞争
3.2 用互斥保护共享数据
3.2.1 在C++中使用互斥
3.2.2 组织和编排代码以保护共享数据
3.2.3 发现接口固有的条件竞争
3.2.4 死锁:问题和解决方法
3.2.5 防范死锁的补充准则
3.2.6 运用std::unique_lock<>灵活加锁
3.2.7 在不同作用域之间转移互斥归属权
3.2.8 按适合的粒度加锁
3.3 保护共享数据的其他工具
3.3.1 在初始化过程中保护共享数据
3.3.2 保护甚少更新的数据结构
3.3.3 递归加锁
3.4 小结
第4章 并发操作的同步
4.1 等待事件或等待其他条件
4.1.1 凭借条件变量等待条件成立
4.1.2 利用条件变量构建线程安全的队列
4.2 使用future等待一次性事件发生
4.2.1 从后台任务返回值
4.2.2 关联future实例和任务
4.2.3 创建std::promise
4.2.4 将异常保存到future中
4.2.5 多个线程一起等待
4.3 限时等待
4.3.1 时钟类
4.3.2 时长类
4.3.3 时间点类
4.3.4 接受超时时限的函数
4.4 运用同步操作简化代码
4.4.1 利用future进行函数式编程
4.4.2 使用消息传递进行同步
4.4.3 符合并发技术规约的后续风格并发
4.4.4 后续函数的连锁调用
4.4.5 等待多个future
4.4.6 运用std::experimental::when_any()函数等待多个future,直到其中之一准备就绪
4.4.7 线程闩和线程卡——并发技术规约提出的新特性
4.4.8 基本的线程闩类std::experimental::latch
4.4.9 基本的线程卡类std::experimental::barrier
4.4.10 std::experimental::flex_barrier——std::experimental::barrier的灵活版本
4.5 小结
第5章 C++内存模型和原子操作
5.1 内存模型基础
5.1.1 对象和内存区域
5.1.2 对象、内存区域和并发
5.1.3 改动序列
5.2 C++中的原子操作及其类别
5.2.1 标准原子类型
5.2.2 操作std::atomic_flag
5.2.3 操作std::atomic<bool>
5.2.4 操作std::atomic<T*>:算术形式的指针运算
5.2.5 操作标准整数原子类型
5.2.6 泛化的std::atomic<>类模板
5.2.7 原子操作的非成员函数
5.3 同步操作和强制次序
5.3.1 同步关系
5.3.2 先行关系
5.3.3 原子操作的内存次序
5.3.4 释放序列和同步关系
5.3.5 栅栏
5.3.6 凭借原子操作令非原子操作服从内存次序
5.3.7 强制非原子操作服从内存次序
5.4 小结
第6章 设计基于锁的并发数据结构
6.1 并发设计的内涵
设计并发数据结构的指引
6.2 基于锁的并发数据结构
6.2.1 采用锁实现线程安全的栈容器
6.2.2 采用锁和条件变量实现线程安全的队列容器
6.2.3 采用精细粒度的锁和条件变量实现线程安全的队列容器
6.3 设计更复杂的基于锁的并发数据结构
6.3.1 采用锁编写线程安全的查找表
6.3.2 采用多种锁编写线程安全的链表
6.4 小结
第7章 设计无锁数据结构
7.1 定义和推论
7.1.1 非阻塞型数据结构
7.1.2 无锁数据结构
7.1.3 无须等待的数据结构
7.1.4 无锁数据结构的优点和缺点
7.2 无锁数据结构范例
7.2.1 实现线程安全的无锁栈
7.2.2 制止麻烦的内存泄漏:在无锁数据结构中管理内存
7.2.3 运用风险指针检测无法回收的节点
7.2.4 借引用计数检测正在使用中的节点
7.2.5 为无锁栈容器施加内存模型
7.2.6 实现线程安全的无锁队列
7.3 实现无锁数据结构的原则
7.3.1 原则1:在原型设计中使用std::memory_order_seq_cst次序
7.3.2 原则2:使用无锁的内存回收方案
7.3.3 原则3:防范ABA问题
7.3.4 原则4:找出忙等循环,协助其他线程
7.4 小结
第8章 设计并发代码
8.1 在线程间切分任务的方法
8.1.1 先在线程间切分数据,再开始处理
8.1.2 以递归方式划分数据
8.1.3 依据工作类别划分任务
8.2 影响并发代码性能的因素
8.2.1 处理器的数量
8.2.2 数据竞争和缓存乒乓(cache ping-pong)
8.2.3 不经意共享
8.2.4 数据的紧凑程度
8.2.5 过度任务切换与线程过饱和
8.3 设计数据结构以提升多线程程序的性能
8.3.1 针对复杂操作的数据划分
8.3.2 其他数据结构的访问模式
8.4 设计并发代码时要额外考虑的因素
8.4.1 并行算法代码中的异常安全
8.4.2 可伸缩性和Amdahl定律
8.4.3 利用多线程“掩藏”等待行为
8.4.4 借并发特性改进响应能力
8.5 并发代码的设计实践
8.5.1 std::for_each()的并行实现
8.5.2 std::find()的并行实现
8.5.3 std::partial_sum()的并行实现
8.6 小结
第9章 高级线程管理
9.1 线程池
9.1.1 最简易可行的线程池
9.1.2 等待提交给线程池的任务完成运行
9.1.3 等待其他任务完成的任务
9.1.4 避免任务队列上的争夺
9.1.5 任务窃取
9.2 中断线程
9.2.1 发起一个线程,以及把它中断
9.2.2 检测线程是否被中断
9.2.3 中断条件变量上的等待
9.2.4 中断条件变量std::condition_variable_any上的等待
9.2.5 中断其他阻塞型等待
9.2.6 处理中断
9.2.7 在应用程序退出时中断后台任务
9.3 小结
第10章 并行算法函数
10.1 并行化的标准库算法函数
10.2 执行策略
10.2.1 因指定执行策略而普遍产生的作用
10.2.2 std::execution::sequenced_policy
10.2.3 std::execution::parallel_policy
10.2.4 std::execution::parallel_unsequenced_policy
10.3 C++标准库的并行算法函数
10.3.1 并行算法函数的使用范例
10.3.2 访问计数
10.4 小结
第11章 多线程应用的测试和除错
11.1 与并发相关的错误类型
11.1.1 多余的阻塞
11.1.2 条件竞争
11.2 定位并发相关的错误的技法
11.2.1 审查代码并定位潜在错误
11.2.2 通过测试定位与并发相关的错误
11.2.3 设计可测试的代码
11.2.4 多线程测试技术
11.2.5 以特定结构组织多线程的测试代码
11.2.6 测试多线程代码的性能
11.3 小结
附录A C++11精要:部分语言特性
A.1 右值引用
A.1.1 移动语义
A.1.2 右值引用和函数模板
A.2 删除函数
A.3 默认函数
A.4 常量表达式函数
A.4.1 constexpr关键字和用户定义型别
A.4.2 constexpr对象
A.4.3 constexpr函数要符合的条件
A.4.4 constexpr与模板
A.5 lambda函数
涉及本地变量的lambda函数
A.6 变参模板
展开参数包
A.7 自动推导变量的型别
A.8 线程局部变量
A.9 类模板的参数推导
A.10 小结
附录B 各并发程序库的简要对比
附录C 消息传递程序库和完整的自动柜员机范例
附录D C++11线程库参考名录
D.1 <chrono>头文件
D.1.1 std::chrono::duration类模板
D.1.2 std::chrono::time_point类模板
D.1.3 std::chrono::system_clock类
D.1.4 std::chrono::steady_clock类
D.1.5 std::chrono::high_resolution_clock typedef
D.2 <condition_variable>头文件
D.2.1 std::condition_variable类
D.2.2 std::condition_variable_any类
D.3 <atomic>头文件
D.3.1 std::atomic_xxx类定义
D.3.2 ATOMIC_xxx_LOCK_FREE宏
D.3.3 ATOMIC_VAR_INIT宏
D.3.4 std::memory_order枚举型别
D.3.5 std::atomic_thread_fence()函数
D.3.6 std::atomic_signal_fence()函数
D.3.7 std::atomic_flag类
D.3.8 std::atomic类模板
D.3.9 类模板std::atomic的特化
D.3.10 std::atomic<integral-type>特化
D.3.11 std::atomic<T*>偏特化
D.4 <future>头文件
D.4.1 std::future类模板
D.4.2 std::shared_future类模板
D.4.3 std::packaged_task类模板
D.4.4 std::promise类模板
D.4.5 std::async()函数模板
D.5 <mutex>头文件
D.5.1 std::mutex类
D.5.2 std::recursive_mutex类
D.5.3 std::timed_mutex类
D.5.4 std::recursive_timed_mutex类
D.5.5 std::shared_mutex类
D.5.6 std::shared_timed_mutex类
D.5.7 std::lock_guard类模板
D.5.8 std::scoped_lock类模板
D.5.9 std::unique_lock类模板
D.5.10 std::shared_lock类模板
D.5.11 std::lock()函数模板
D.5.12 std::try_lock()函数模板
D.5.13 std::once_flag类
D.5.14 std::call_once()函数模板
D.6 <ratio>头文件
D.6.1 std::ratio类模板
D.6.2 std::ratio_add模板别名
D.6.3 std::ratio_subtract模板别名
D.6.4 std::ratio_multiply模板别名
D.6.5 std::ratio_divide模板别名
D.6.6 std::ratio_equal类模板
D.6.7 std::ratio_not_equal类模板
D.6.8 std::ratio_less类模板
D.6.9 std::ratio_greater类模板
D.6.10 std::ratio_less_equal类模板
D.6.11 std::ratio_greater_equal类模板
D.7 <thread>头文件
D.7.1 std::thread类
D.7.2 std::this_thread名字空间
· · · · · · (收起)
1.1 什么是并发
1.1.1 计算机系统中的并发
1.1.2 并发的方式
1.1.3 并发与并行
1.2 为什么使用并发技术
1.2.1 为分离关注点而并发
1.2.2 为性能而并发:任务并行和数据并行
1.2.3 什么时候避免并发
1.3 并发与C++多线程
1.3.1 C++多线程简史
1.3.2 新标准对并发的支持
1.3.3 C++14和C++17进一步支持并发和并行
1.3.4 标准C++线程库的效率
1.3.5 平台专属的工具
1.4 启程上路
1.5 小结
第2章 线程管控
2.1 线程的基本管控
2.1.1 发起线程
2.1.2 等待线程完成
2.1.3 在出现异常的情况下等待
2.1.4 在后台运行线程
2.2 向线程函数传递参数
2.3 移交线程归属权
2.4 在运行时选择线程数量
2.5 识别线程
2.6 小结
第3章 在线程间共享数据
3.1 线程间共享数据的问题
3.1.1 条件竞争
3.1.2 防止恶性条件竞争
3.2 用互斥保护共享数据
3.2.1 在C++中使用互斥
3.2.2 组织和编排代码以保护共享数据
3.2.3 发现接口固有的条件竞争
3.2.4 死锁:问题和解决方法
3.2.5 防范死锁的补充准则
3.2.6 运用std::unique_lock<>灵活加锁
3.2.7 在不同作用域之间转移互斥归属权
3.2.8 按适合的粒度加锁
3.3 保护共享数据的其他工具
3.3.1 在初始化过程中保护共享数据
3.3.2 保护甚少更新的数据结构
3.3.3 递归加锁
3.4 小结
第4章 并发操作的同步
4.1 等待事件或等待其他条件
4.1.1 凭借条件变量等待条件成立
4.1.2 利用条件变量构建线程安全的队列
4.2 使用future等待一次性事件发生
4.2.1 从后台任务返回值
4.2.2 关联future实例和任务
4.2.3 创建std::promise
4.2.4 将异常保存到future中
4.2.5 多个线程一起等待
4.3 限时等待
4.3.1 时钟类
4.3.2 时长类
4.3.3 时间点类
4.3.4 接受超时时限的函数
4.4 运用同步操作简化代码
4.4.1 利用future进行函数式编程
4.4.2 使用消息传递进行同步
4.4.3 符合并发技术规约的后续风格并发
4.4.4 后续函数的连锁调用
4.4.5 等待多个future
4.4.6 运用std::experimental::when_any()函数等待多个future,直到其中之一准备就绪
4.4.7 线程闩和线程卡——并发技术规约提出的新特性
4.4.8 基本的线程闩类std::experimental::latch
4.4.9 基本的线程卡类std::experimental::barrier
4.4.10 std::experimental::flex_barrier——std::experimental::barrier的灵活版本
4.5 小结
第5章 C++内存模型和原子操作
5.1 内存模型基础
5.1.1 对象和内存区域
5.1.2 对象、内存区域和并发
5.1.3 改动序列
5.2 C++中的原子操作及其类别
5.2.1 标准原子类型
5.2.2 操作std::atomic_flag
5.2.3 操作std::atomic<bool>
5.2.4 操作std::atomic<T*>:算术形式的指针运算
5.2.5 操作标准整数原子类型
5.2.6 泛化的std::atomic<>类模板
5.2.7 原子操作的非成员函数
5.3 同步操作和强制次序
5.3.1 同步关系
5.3.2 先行关系
5.3.3 原子操作的内存次序
5.3.4 释放序列和同步关系
5.3.5 栅栏
5.3.6 凭借原子操作令非原子操作服从内存次序
5.3.7 强制非原子操作服从内存次序
5.4 小结
第6章 设计基于锁的并发数据结构
6.1 并发设计的内涵
设计并发数据结构的指引
6.2 基于锁的并发数据结构
6.2.1 采用锁实现线程安全的栈容器
6.2.2 采用锁和条件变量实现线程安全的队列容器
6.2.3 采用精细粒度的锁和条件变量实现线程安全的队列容器
6.3 设计更复杂的基于锁的并发数据结构
6.3.1 采用锁编写线程安全的查找表
6.3.2 采用多种锁编写线程安全的链表
6.4 小结
第7章 设计无锁数据结构
7.1 定义和推论
7.1.1 非阻塞型数据结构
7.1.2 无锁数据结构
7.1.3 无须等待的数据结构
7.1.4 无锁数据结构的优点和缺点
7.2 无锁数据结构范例
7.2.1 实现线程安全的无锁栈
7.2.2 制止麻烦的内存泄漏:在无锁数据结构中管理内存
7.2.3 运用风险指针检测无法回收的节点
7.2.4 借引用计数检测正在使用中的节点
7.2.5 为无锁栈容器施加内存模型
7.2.6 实现线程安全的无锁队列
7.3 实现无锁数据结构的原则
7.3.1 原则1:在原型设计中使用std::memory_order_seq_cst次序
7.3.2 原则2:使用无锁的内存回收方案
7.3.3 原则3:防范ABA问题
7.3.4 原则4:找出忙等循环,协助其他线程
7.4 小结
第8章 设计并发代码
8.1 在线程间切分任务的方法
8.1.1 先在线程间切分数据,再开始处理
8.1.2 以递归方式划分数据
8.1.3 依据工作类别划分任务
8.2 影响并发代码性能的因素
8.2.1 处理器的数量
8.2.2 数据竞争和缓存乒乓(cache ping-pong)
8.2.3 不经意共享
8.2.4 数据的紧凑程度
8.2.5 过度任务切换与线程过饱和
8.3 设计数据结构以提升多线程程序的性能
8.3.1 针对复杂操作的数据划分
8.3.2 其他数据结构的访问模式
8.4 设计并发代码时要额外考虑的因素
8.4.1 并行算法代码中的异常安全
8.4.2 可伸缩性和Amdahl定律
8.4.3 利用多线程“掩藏”等待行为
8.4.4 借并发特性改进响应能力
8.5 并发代码的设计实践
8.5.1 std::for_each()的并行实现
8.5.2 std::find()的并行实现
8.5.3 std::partial_sum()的并行实现
8.6 小结
第9章 高级线程管理
9.1 线程池
9.1.1 最简易可行的线程池
9.1.2 等待提交给线程池的任务完成运行
9.1.3 等待其他任务完成的任务
9.1.4 避免任务队列上的争夺
9.1.5 任务窃取
9.2 中断线程
9.2.1 发起一个线程,以及把它中断
9.2.2 检测线程是否被中断
9.2.3 中断条件变量上的等待
9.2.4 中断条件变量std::condition_variable_any上的等待
9.2.5 中断其他阻塞型等待
9.2.6 处理中断
9.2.7 在应用程序退出时中断后台任务
9.3 小结
第10章 并行算法函数
10.1 并行化的标准库算法函数
10.2 执行策略
10.2.1 因指定执行策略而普遍产生的作用
10.2.2 std::execution::sequenced_policy
10.2.3 std::execution::parallel_policy
10.2.4 std::execution::parallel_unsequenced_policy
10.3 C++标准库的并行算法函数
10.3.1 并行算法函数的使用范例
10.3.2 访问计数
10.4 小结
第11章 多线程应用的测试和除错
11.1 与并发相关的错误类型
11.1.1 多余的阻塞
11.1.2 条件竞争
11.2 定位并发相关的错误的技法
11.2.1 审查代码并定位潜在错误
11.2.2 通过测试定位与并发相关的错误
11.2.3 设计可测试的代码
11.2.4 多线程测试技术
11.2.5 以特定结构组织多线程的测试代码
11.2.6 测试多线程代码的性能
11.3 小结
附录A C++11精要:部分语言特性
A.1 右值引用
A.1.1 移动语义
A.1.2 右值引用和函数模板
A.2 删除函数
A.3 默认函数
A.4 常量表达式函数
A.4.1 constexpr关键字和用户定义型别
A.4.2 constexpr对象
A.4.3 constexpr函数要符合的条件
A.4.4 constexpr与模板
A.5 lambda函数
涉及本地变量的lambda函数
A.6 变参模板
展开参数包
A.7 自动推导变量的型别
A.8 线程局部变量
A.9 类模板的参数推导
A.10 小结
附录B 各并发程序库的简要对比
附录C 消息传递程序库和完整的自动柜员机范例
附录D C++11线程库参考名录
D.1 <chrono>头文件
D.1.1 std::chrono::duration类模板
D.1.2 std::chrono::time_point类模板
D.1.3 std::chrono::system_clock类
D.1.4 std::chrono::steady_clock类
D.1.5 std::chrono::high_resolution_clock typedef
D.2 <condition_variable>头文件
D.2.1 std::condition_variable类
D.2.2 std::condition_variable_any类
D.3 <atomic>头文件
D.3.1 std::atomic_xxx类定义
D.3.2 ATOMIC_xxx_LOCK_FREE宏
D.3.3 ATOMIC_VAR_INIT宏
D.3.4 std::memory_order枚举型别
D.3.5 std::atomic_thread_fence()函数
D.3.6 std::atomic_signal_fence()函数
D.3.7 std::atomic_flag类
D.3.8 std::atomic类模板
D.3.9 类模板std::atomic的特化
D.3.10 std::atomic<integral-type>特化
D.3.11 std::atomic<T*>偏特化
D.4 <future>头文件
D.4.1 std::future类模板
D.4.2 std::shared_future类模板
D.4.3 std::packaged_task类模板
D.4.4 std::promise类模板
D.4.5 std::async()函数模板
D.5 <mutex>头文件
D.5.1 std::mutex类
D.5.2 std::recursive_mutex类
D.5.3 std::timed_mutex类
D.5.4 std::recursive_timed_mutex类
D.5.5 std::shared_mutex类
D.5.6 std::shared_timed_mutex类
D.5.7 std::lock_guard类模板
D.5.8 std::scoped_lock类模板
D.5.9 std::unique_lock类模板
D.5.10 std::shared_lock类模板
D.5.11 std::lock()函数模板
D.5.12 std::try_lock()函数模板
D.5.13 std::once_flag类
D.5.14 std::call_once()函数模板
D.6 <ratio>头文件
D.6.1 std::ratio类模板
D.6.2 std::ratio_add模板别名
D.6.3 std::ratio_subtract模板别名
D.6.4 std::ratio_multiply模板别名
D.6.5 std::ratio_divide模板别名
D.6.6 std::ratio_equal类模板
D.6.7 std::ratio_not_equal类模板
D.6.8 std::ratio_less类模板
D.6.9 std::ratio_greater类模板
D.6.10 std::ratio_less_equal类模板
D.6.11 std::ratio_greater_equal类模板
D.7 <thread>头文件
D.7.1 std::thread类
D.7.2 std::this_thread名字空间
· · · · · · (收起)
喜欢读"C++并发编程实战 (第2版)"的人也喜欢 · · · · · ·
C++并发编程实战 (第2版)的书评 · · · · · · ( 全部 15 条 )





> 更多书评 15篇
论坛 · · · · · ·
在这本书的论坛里发言这本书的其他版本 · · · · · · ( 全部3 )
-
Manning Publications (2012)8.9分 153人读过
-
Manning Publications (2017)9.2分 77人读过
以下书单推荐 · · · · · · ( 全部 )
- 豆瓣高分书籍是否名实相符(一) (无心恋战)
- C/C++必读经典 (司马元朗)
- Concurrency/Parallelism/并发/并行 (李鼎)
- C++ (第二棵梧桐树)
- 程序员的自我修养 (王聪)
谁读这本书? · · · · · ·
二手市场
· · · · · ·
- 在豆瓣转让 有740人想读,手里有一本闲着?
订阅关于C++并发编程实战 (第2版)的评论:
feed: rss 2.0
1 有用 黑黑 2023-08-06 13:34:04 上海
很精彩的,本书读完对C++的基本并发编程工具有全面深刻的学习,并发内存模型那章节是比较困难的.感谢人邮重新翻译了这本书.
2 有用 HM773 2024-03-01 00:45:14 北京
磕磕绊绊算是看完了。还是挺有深度的。学到了很多关于并发编程的新知识。中间有一部分没咋懂。之后再复习一遍吧。
2 有用 Marvin不慌 2022-06-08 17:16:04
C++并发编程深度指南,C++标准委员会成员编写的,囊括了C++并发编程多个方面,代码附有中文注释简洁易懂,附赠配套代码文件。
0 有用 山野 2023-11-30 11:54:15 江苏
C++并发库介绍的很清楚,后面并发容器设计比较复杂,细粒度锁部分可以结合多处理器编程艺术看;无锁部分由于涉及GC细节过多看的头大,GC本身就是复杂的“艺术”,估计现在实际项目很少会用到这么复杂的设计,要么语言支持GC要么用锁哪怕细粒度锁,或者参考内核的RCU
3 有用 pink 2021-11-30 12:54:44
看过非官方翻译,感觉不太通顺。人邮的正式版本读着就很流畅,原本一些不太明白的地方瞬间豁然开朗。