首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++11 多線程基礎入門:std::thread 全方位指南

     編輯:關於C++

標準化多線程支援的里程碑

C++11(當時稱 C++0x)正式將多線程納入標準庫,統一了跨平台執行緒模型,終結了長期依賴 POSIX Threads、Windows API 等平台專用庫的歷史,極大提升了程式碼可移植性。

核心類別:std::thread

std::thread 是管理執行緒生命週期的核心類別,提供啟動、等待、分離等基本操作。

啟動執行緒的多種方式

1. 普通函數

void do_work();
std::thread t(do_work); // 立即啟動新執行緒執行 do_work

2. 函數物件

struct Task {
    void operator()() { /* 執行緒工作 */ }
};
Task task;
std::thread t(task); // 複製 task 到新執行緒
// 若需傳遞引用,使用 std::ref
std::thread t_ref(std::ref(task));

3. Lambda 表達式

std::thread t([]{ /* 內聯執行緒邏輯 */ });

4. 攜帶任意參數

std::thread 建構函數採用可變參數模板,支援任意類型、任意數量參數傳遞:

void process(int id, const std::string& name, std::vector<double> data);

std::thread t(process, 42, "hello", std::vector<double>(23, 3.141));
// 參數會被複製或移動到新執行緒
// 需傳引用時使用 std::ref
std::string s;
std::thread t2(foo, std::ref(s));

執行緒同步:join 與 detach

  • join():阻塞當前執行緒,直到目標執行緒結束。確保資源正確釋放、結果可獲取。
  • detach():讓執行緒獨立運行,主執行緒不再等待。需確保執行緒內部不訪問已銷毀的局部變數。
std::thread t(do_work);
t.join(); // 等待結束

// 或
std::thread t(do_work);
t.detach(); // 獨立運行

最佳實踐提醒

  • 優先使用 join() 確保資源安全回收。
  • 傳遞參數時注意生命週期,避免懸空引用。
  • 執行緒函數異常未捕獲會導致程式終止,建議在執行緒入口處包裹 try-catch。
  • 避免過度建立執行緒,考慮使用執行緒池或 std::async。

展望

掌握 std::thread 基礎後,下一步將深入探討執行緒間資料共享與同步機制(互斥鎖、條件變量、原子操作等)。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved