| 函數 | 作用 |
pthread_mutex_init/lock/unlock | 互斥鎖:保護臨界區 |
pthread_cond_init/wait/signal | 條件變量:等待/通知條件滿足 |
pthread_cond_wait | 原子釋放鎖並阻塞,被喚醒後重新獲取鎖 |
生產者-消費者模型設計
共享緩衝隊列 + 一把互斥鎖 + 一個條件變量。關鍵點:
- 生產者:鎖 → 生產 → 通知 → 解鎖
- 消費者:鎖 →
while (queue.empty()) cond_wait → 消費 → 解鎖
- 用 while 而非 if 防止虛假喚醒。
C++ 封裝類圖
Mutex : pthread_mutex_t 封裝,lock()/unlock()
CondMutex : Mutex + pthread_cond_t,wait()/signal()
ProduceConsume : 純虛類,定義 Produce()/Consume()/ProduceComplete()/ConsumeComplete()/Condition()
ThreadFuncLoader: 靜態線程入口,調用上述虛函數
核心代碼片段
// 生產者線程邏輯
void* produce(void* arg) {
ProduceConsume* pc = (ProduceConsume*)arg;
while (true) {
pc->mutex.lock();
if (pc->ProduceComplete()) { pc->mutex.unlock(); break; }
pc->Produce(); // 實際生產動作
pc->cond.signal(); // 通知消費者
pc->mutex.unlock();
usleep(1000); // 節流
}
return NULL;
}
// 消費者線程邏輯
void* consume(void* arg) {
ProduceConsume* pc = (ProduceConsume*)arg;
while (true) {
pc->mutex.lock();
while (!pc->ProduceComplete() && !pc->Condition()) // 條件不滿足等待
pc->cond.wait(pc->mutex);
if (pc->ConsumeComplete()) { pc->mutex.unlock(); break; }
pc->Consume();
pc->mutex.unlock();
usleep(1000);
}
return NULL;
}
使用方式
- 繼承
ProduceConsume 實現五個純虛函數。
- 創建對象,調用
ThreadFuncLoader::StartProduce/Consume 啟動線程。
- 框架自動處理鎖、等待、通知,使用者專注業務邏輯。
代碼倉庫
完整實現見 GitHub:Unix-Network-Programming
此封裝展示了如何將 POSIX 同步原語包裝為可復用的 C++ 框架,是系統級並發編程的優秀實踐。
- 上一篇文章: strlen 與 strcpy 關鍵差異:長度計算 vs 內存拷貝(含 \0 陷阱)
- 下一篇文章: POJ 3687 Labeling Balls:拓撲排序逆序 + 優先隊列貪心
Copyright ©
程式碼之家 All Rights Reserved