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

Linux 多執行緒程式設計:pthread 控制與同步機制精要

     編輯:關於C語言

執行緒優勢

  • 建立/銷毀開銷遠小於進程
  • 共享進程位址空間,資料交換高效

典型應用場景

  • 非同步事件處理
  • 阻塞型 I/O 並發(如網路伺服器)
  • 計算密集型任務並行化

核心 API

定義於 <pthread.h>,編譯需連結 -lpthread

函數用途
pthread_create建立執行緒
pthread_join等待執行緒結束
pthread_detach分離執行緒(自動回收資源)
pthread_exit終止呼叫執行緒
pthread_cancel請求取消執行緒

同步機制

互斥鎖

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

pthread_mutex_lock(&mutex);
// 臨界區
pthread_mutex_unlock(&mutex);
  • 一般鎖:PTHREAD_MUTEX_DEFAULT
  • 遞迴鎖:PTHREAD_MUTEX_RECURSIVE(同一執行緒可重複鎖定)
  • 錯誤檢查鎖:PTHREAD_MUTEX_ERRORCHECK

條件變數

pthread_cond_t cond = PTHREAD_COND_INITIALIZER;
pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER;

// 等待方
pthread_mutex_lock(&mutex);
while (!condition) pthread_cond_wait(&cond, &mutex);
// 條件滿足
pthread_mutex_unlock(&mutex);

// 通知方
pthread_mutex_lock(&mutex);
condition = true;
pthread_cond_signal(&cond);  // 或 broadcast
pthread_mutex_unlock(&mutex);

讀寫鎖

多讀單寫場景優化:pthread_rwlock_t

執行緒池模式

避免頻繁建立/銷毀開銷,預先建立固定數量工作執行緒,任務佇列分發。推薦使用 Boost.ThreadPool 或 C++17 std::execution::par / 專用庫。

常見陷阱

  • 忘記 pthread_join 導致資源洩漏
  • 鎖定順序不一致造成死結
  • 條件變數虛假喚醒 → 必須用 while 而非 if 檢查條件
  • 訊號處理函數中呼叫非 async-signal-safe 函數

延伸學習

  • C++11 <thread>, <mutex>, <condition_variable>、<future>
  • 無鎖資料結構、RCU、記憶體排序模型
  • 效能分析工具:perf, helgrind, TSan
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved