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

POSIX Threads (pthread) 入門與常見問題

     編輯:C++ 入門

POSIX Threads (pthread) 入門與常見問題

基本概念

POSIX 線程 (pthread) 是 UNIX/Linux 系統多線程編程的標準 API。核心函數:

  • pthread_create:創建線程。
  • pthread_join:等待線程結束。
  • pthread_mutex_lock/unlock:互斥鎖同步。
  • pthread_cond_wait/signal:條件變量同步。
  • pthread_attr_t:屬性設置(棧大小、分離狀態等)。

iOS/macOS 上的 POSIX 支持

Xcode Help 搜索 "POSIX" → "Using POSIX Threads" 可見支持的函數與屬性。iOS 完整支持 pthread,但建議優先使用更高層的 GCD (Grand Central Dispatch) 或 NSOperationQueue。

CMake/MathGL 編譯提示 "Couldn't find OpenMP, enable POSIX threads instead"

含義:OpenMP 未找到,建議啟用 pthread 作為並行後端。
解決:
1. 安裝 OpenMP(如 libomp-dev)。
2. 或在 CMake 中啟用 pthread:set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -pthread") 並 find_package(Threads REQUIRED),鏈接 Threads::Threads。
3. MathGL 等庫可通過宏控制後端:-DMATHGL_USE_PTHREAD=ON。

簡易線程池模型

// 工作隊列 + 條件變量 + 互斥鎖
queue<Task> tasks;
mutex mtx;
cond_var cv;
bool stop = false;

void worker() {
    while (true) {
        unique_lock<mutex> lock(mtx);
        cv.wait(lock, []{ return !tasks.empty() || stop; });
        if (stop && tasks.empty()) return;
        Task t = tasks.front(); tasks.pop();
        lock.unlock();
        t.execute();
    }
}

常見坑點

  • 忘記 pthread_join 導致主線程提前退出、資源洩漏。
  • 鎖未釋放(死鎖)、雙重鎖定。
  • 線程間共享數據無同步(競態條件)。
  • 棧大小不足(遞歸深、大局部數組),需 pthread_attr_setstacksize。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved