C++11 的线程管理(`std::thread`)
之前我研究了机器人开发中的 ROS2(Jazzy)系统相关内容。并将官网中比较重要的教程和概念,按照自己的学习顺序翻译成了中文,并进行了整理和记录。我在记录的过程中,还针对一些不太好理解的部分进行了额外的研究和补充说明。到目前为止,已经整理了20多篇文章。如果你想回顾之前的内容,可以查阅主页中 ROS2(Jazzy)相关文章。
在研究 ROS2 的过程中,我发现它使用了不少 C++11 的新特性。这让我意识到,深入掌握这些特性对于深入理解 ROS2 的实现原理和优化代码非常重要。
因此,我萌生了撰写 C++11 系列文章的想法。目前已经完成了以下几篇文章:
- C++11 ROS2性能狂飙:C++11移动语义‘偷梁换柱’实战
- C++11 Lambda 表达式 以及
std::function
和std::bind
- C++11 智能指针:
std::unique_ptr
、std::shared_ptr
和std::weak_ptr
而本文是第四篇,主要总结的是 C++11 的线程管理(std::thread
)
C++11 的线程管理
C++11 引入了全面的多线程支持,使并发编程成为语言标准的一部分。核心组件包括线程管理(std::thread
)、原子操作(std::atomic
)和同步机制(互斥锁、条件变量)。
线程管理类 std::thread
,用于创建和管理操作系统线程。它提供了跨平台的线程操作接口,消除了对平台特定 API(如 POSIX pthreads 或 Windows Threads)的依赖。
线程创建
我们可以通过传递可调用对象来构造 std::thread
线程实例,比如函数、Lambda、函数对象:
#include <thread>// 函数形式
void print(int num, const std::string& str) {std::cout << num << " " << str << "\n";
}// Lambda 形式
auto lambda = [](float f) { /*...*/ };int main() {// 创建线程并立即执行std::thread t1(print, 42, "Hello"); // 值传递std::string msg = "World";std::thread t2([&msg]() { // 引用捕获std::cout << msg << "\n";});t1.join();t2.join();
}
当我们构造 std::thread
实例时,可以使用以下几种数据传递机制:
- 默认行为:参数按值拷贝
- 传递引用:需使用
std::ref
包装 - 移动语义:使用
std::move
避免拷贝
void process_data(