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

Unix 網絡編程:互斥鎖、條件變量與生產者-消費者模型 C++ 封裝

     編輯:C++ 入門

POSIX 線程同步原語速查

生產者-消費者模型設計

共享緩衝隊列 + 一把互斥鎖 + 一個條件變量。關鍵點:

  • 生產者:鎖 → 生產 → 通知 → 解鎖
  • 消費者:鎖 → 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;
}

使用方式

  1. 繼承 ProduceConsume 實現五個純虛函數。
  2. 創建對象,調用 ThreadFuncLoader::StartProduce/Consume 啟動線程。
  3. 框架自動處理鎖、等待、通知,使用者專注業務邏輯。

代碼倉庫

完整實現見 GitHub:Unix-Network-Programming

此封裝展示了如何將 POSIX 同步原語包裝為可復用的 C++ 框架,是系統級並發編程的優秀實踐。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
函數作用
pthread_mutex_init/lock/unlock互斥鎖:保護臨界區
pthread_cond_init/wait/signal條件變量:等待/通知條件滿足
pthread_cond_wait原子釋放鎖並阻塞,被喚醒後重新獲取鎖