生產者-消費者問題 是進程同步與進程間通信(IPC)的教科書級案例。場景:
該問題綜合運用了進程管理的所有核心機制:
| 機制 | 在問題中的角色 | 可選實現 |
|---|---|---|
| 進程創建/終結 | 生產者/消費者為獨立進程 | `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(); // 消費耗時操作(關鍵區外)
}
}
下篇將展示基於共享內存 + System V 信號量的完整 C 實現與運行演示。