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

生產者消費者問題 C 語言實戰:信號量與共享記憶體實現進程同步

     編輯:關於C語言

專案背景與架構設計

生產者-消費者模型是經典的進程同步問題。本實作採用 System V 信號量 實現互斥與同步,配合 共享記憶體 作為緩衝區,透過命令列參數區分生產者(-p)與消費者(-c)進程。

核心資料結構

// 共享記憶體結構
typedef struct {
    int buffer[8];   // 環狀緩衝區,容量 8
    int count;       // 當前產品數量
    int in, out;     // 生產/消費指標
} SharedMemory;

// 信號量聯合體(Linux 需自行定義)
union semun {
    int val;
    struct semid_ds *buf;
    unsigned short *array;
};

關鍵同步邏輯

生產者流程

  1. 建立並初始化信號量(互斥鎖 + 空位計數 + 滿位計數)
  2. 建立共享記憶體並映射到進程空間
  3. 循環:P(empty) → P(mutex) → 生產資料 → V(mutex) → V(full)
  4. 緩衝區滿時阻塞,直到消費者取走產品
  5. 結束前清理資源:刪除信號量、分離並刪除共享記憶體

消費者流程

  1. 獲取現有信號量與共享記憶體
  2. 循環:P(full) → P(mutex) → 取走資料 → V(mutex) → V(empty)
  3. 緩衝區空時阻塞,直到生產者放入產品
  4. 結束時分離共享記憶體(不刪除,由生產者負責)

程式執行示例

$ ./a.out -p &          # 後台啟動生產者
[1] 3562
$ [pid: 3562] producer is running
producer count: 0
produce data. count:1, data:1
produce data. count:2, data:2
produce data. count:3, data:3

$ ./a.out -c              # 前台啟動消費者
[pid: 3563] customer is running
customer count: 3
get data. count:3, data:3
customer count: 2
get data. count:2, data:2
...

關鍵設計決策

  • 雙重信號量機制:互斥鎖保護緩衝區存取,計數信號量追蹤空/滿狀態
  • 非無限等待:滿/空時進程結束而非永久阻塞,避免死鎖
  • 可配置參數:緩衝區大小、延遲時間均可調整
  • 進程間隔離:強調不可用全域變數替代共享記憶體,因為進程擁有獨立位址空間

擴充建議

  • 支援多生產者/多消費者場景
  • 引入優先級機制
  • 使用 POSIX 信號量 (sem_t) 替代 System V,提高可移植性
  • 加入共享記憶體損壞檢測與恢復機制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved