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

經典併發模型:生產者-消費者問題深度解析(上)

     編輯:關於C語言

問題定義與核心約束

生產者-消費者問題 是進程同步與進程間通信(IPC)的教科書級案例。場景:

  • 共享有限緩衝區(容量 C),存放產品
  • 生產者 持續生產並放入緩衝區,滿時阻塞等待
  • 消費者 持續從緩衝區取走產品,空時阻塞等待
  • 要求:互斥訪問緩衝區、同步生產/消費節奏

知識體系整合

該問題綜合運用了進程管理的所有核心機制:

機制在問題中的角色可選實現
進程創建/終結生產者/消費者為獨立進程`fork()` + `exec()` 或 `pthread_create()`
進程間通信傳遞產品數據管道、FIFO、共享內存、消息隊列、Socket
同步互斥保護緩衝區、協調阻塞/喚醒信號量、互斥鎖+條件變量、文件鎖

邏輯偽代碼

/* 共享變量 */
int count = 0;          // 當前產品數
sem_t mutex = 1;        // 互斥信號量(二值)
sem_t empty = C;        // 空槽位計數
sem_t full = 0;         // 滿產品計數

/* 生產者 */
void producer() {
    while (true) {
        produce_item();           // 生產耗時操作(關鍵區外)
        sem_wait(&empty);         // 等待空槽
        sem_wait(&mutex);         // 進入臨界區
        put_item_into_buffer();   // 放入緩衝區
        count++;
        sem_post(&mutex);         // 退出臨界區
        sem_post(&full);          // 通知有產品
    }
}

/* 消費者 */
void consumer() {
    while (true) {
        sem_wait(&full);          // 等待產品
        sem_wait(&mutex);         // 進入臨界區
        take_item_from_buffer();  // 取出產品
        count--;
        sem_post(&mutex);         // 退出臨界區
        sem_post(&empty);         // 通知有空槽
        consume_item();           // 消費耗時操作(關鍵區外)
    }
}

關鍵設計點

  1. 雙重信號量協調:`empty`/`full` 追蹤資源狀態,`mutex` 保護緩衝區完整性
  2. 關鍵區最小化:耗時的生產/消費動作放在鎖外,提高併發度
  3. P/V 操作順序:先申請資源信號量再申請互斥鎖,避免死鎖(若反序,滿/空時持有 mutex 導致對方無法進入釋放資源)

下篇將展示基於共享內存 + System V 信號量的完整 C 實現與運行演示。

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