跳转至

💡 一分钟速览:按文件阅读项目中《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与智能指针作为参数。站外的第二版中文笔记仅供辅助,可能暂时无法访问。

相关主题

评论