💡 一分钟速览:按文件阅读项目中《C++ Concurrency in Action》第 1–2 章示例,解释线程创建、join、所有权转移和运行前需要注意的坑。
最后更新:2026-10-13
C++ Concurrency in Action:代码导读¶
本页引导阅读项目中的第 1、2 章示例,不复刻原书内容。每读一个文件,先问:线程由谁拥有?怎样结束?会不会比它引用的数据活得更久?
建议顺序¶
| 文件 | 重点 |
|---|---|
第 1 章 1_helloworld.cpp |
std::thread 启动工作,join() 等待完成。线程对象析构前必须不再处于 joinable 状态。 |
第 2 章 2.1_basic.cpp |
可调用对象保存局部变量引用;逐条检查退出路径,避免悬空引用。 |
第 2 章 2.2_transfer.cpp |
观察 std::move 如何将 unique_ptr 转交线程。**不要原样运行该文件:**其中两个 std::thread 在 main 结束前未 join 或 detach,joinable 对象析构会调用 std::terminate。 |
第 2 章 2.3_ownership.cpp |
比较线程所有权的移动语义,以及析构时自动 join 的作用域守卫。 |
第 2 章 2.4_runtime.cpp |
查看并行累加如何限制工作线程数量;hardware_concurrency() 只是提示,也可能返回零。 |
第 2 章 2_5_id.cpp |
比较主线程 ID 与工作线程中 std::this_thread::get_id() 的结果。 |
先运行一个安全示例¶
在仓库根目录,用支持线程的 C++11 以上编译器运行第 1 章文件:
c++ -std=c++17 -pthread concurrency/concurrency_v1/chapter1/1_helloworld.cpp -o hello-thread
./hello-thread
预期输出为 hello world。如要试验 2.2_transfer.cpp,请先在离开 main 前加上 t.join(); tt.join();,并保证被引用对象持续存活。detach() 不能代替生命周期分析:分离后的工作可能比局部变量活得更久。
延伸阅读¶
接着学习线程基础、RAII与智能指针作为参数。站外的第二版中文笔记仅供辅助,可能暂时无法访问。
相关主题¶
- C++ 死锁排查 | C++那些事
- C++ SIMD 向量化 | C++那些事
- C++17 并行 STL | C++那些事
- C++ False Sharing 与缓存行 | C++那些事
- GDB 多线程 All-Stop 调试 | C++那些事
- Helgrind 并发错误检测 | C++那些事
- libev 事件循环原理 | C++那些事
- C++ std::thread 内核实现 | C++那些事
- C++ std::thread 与 jthread | C++那些事
- C++ 多线程入门 | C++那些事