網(wǎng)站的風(fēng)格保持一致簡(jiǎn)述網(wǎng)站推廣的方法
之前我研究了機(jī)器人開發(fā)中的 ROS2(Jazzy)系統(tǒng)相關(guān)內(nèi)容。并將官網(wǎng)中比較重要的教程和概念,按照自己的學(xué)習(xí)順序翻譯成了中文,并進(jìn)行了整理和記錄。我在記錄的過(guò)程中,還針對(duì)一些不太好理解的部分進(jìn)行了額外的研究和補(bǔ)充說(shuō)明。到目前為止,已經(jīng)整理了20多篇文章。如果你想回顧之前的內(nèi)容,可以查閱主頁(yè)中 ROS2(Jazzy)相關(guān)文章。
在研究 ROS2 的過(guò)程中,我發(fā)現(xiàn)它使用了不少 C++11 的新特性。這讓我意識(shí)到,深入掌握這些特性對(duì)于深入理解 ROS2 的實(shí)現(xiàn)原理和優(yōu)化代碼非常重要。
因此,我萌生了撰寫 C++11 系列文章的想法。目前已經(jīng)完成了以下幾篇文章:
- C++11 ROS2性能狂飆:C++11移動(dòng)語(yǔ)義‘偷梁換柱’實(shí)戰(zhàn)
- C++11 Lambda 表達(dá)式 以及
std::function
和std::bind
- C++11 智能指針:
std::unique_ptr
、std::shared_ptr
和std::weak_ptr
而本文是第四篇,主要總結(jié)的是 C++11 的線程管理(std::thread
)
C++11 的線程管理
C++11 引入了全面的多線程支持,使并發(fā)編程成為語(yǔ)言標(biāo)準(zhǔn)的一部分。核心組件包括線程管理(std::thread
)、原子操作(std::atomic
)和同步機(jī)制(互斥鎖、條件變量)。
線程管理類 std::thread
,用于創(chuàng)建和管理操作系統(tǒng)線程。它提供了跨平臺(tái)的線程操作接口,消除了對(duì)平臺(tái)特定 API(如 POSIX pthreads 或 Windows Threads)的依賴。
線程創(chuàng)建
我們可以通過(guò)傳遞可調(diào)用對(duì)象來(lái)構(gòu)造 std::thread
線程實(shí)例,比如函數(shù)、Lambda、函數(shù)對(duì)象:
#include <thread>// 函數(shù)形式
void print(int num, const std::string& str) {std::cout << num << " " << str << "\n";
}// Lambda 形式
auto lambda = [](float f) { /*...*/ };int main() {// 創(chuàng)建線程并立即執(zhí)行std::thread t1(print, 42, "Hello"); // 值傳遞std::string msg = "World";std::thread t2([&msg]() { // 引用捕獲std::cout << msg << "\n";});t1.join();t2.join();
}
當(dāng)我們構(gòu)造 std::thread
實(shí)例時(shí),可以使用以下幾種數(shù)據(jù)傳遞機(jī)制:
- 默認(rèn)行為:參數(shù)按值拷貝
- 傳遞引用:需使用
std::ref
包裝 - 移動(dòng)語(yǔ)義:使用
std::move
避免拷貝
void process_data(