38 在生產者消費者問題中,當緩衝區已滿時,生產者應該採取什麼動作?
(A) 繼續生產並覆蓋舊資料
(B) 結束程式執行
(C) 調用pthread_cond_wait()等待
(D) 直接拋出異常
統計: A(0), B(0), C(8), D(0), E(0) #3399885
詳解 (共 2 筆)
【第一步:找關鍵字】
關鍵字:
-
生產者消費者問題(Producer-Consumer)
-
緩衝區已滿(buffer full)
-
生產者(producer)
-
等待(關鍵動作)
? 核心觀念:
滿了不能再放 → 必須等
【第二步:白話翻譯】
這題在問:
? 「如果生產者想放東西,但緩衝區已經滿了,應該怎麼辦?」
【第三步:解題思路】
這題在考什麼觀念?
? 同步機制(condition variable / blocking)
解題步驟
-
判斷 buffer 狀態(已滿)
-
思考能不能再放 → 不行
-
正確行為 → 等
原理與規則(生活比喻)
把 buffer 想成「飲料販賣機」:
-
已經塞滿飲料了
-
補貨員(producer)來了
? 能不能硬塞?
❌ 不行(會壞掉)
? 正確做法:
? 等有人買掉(consumer 消費)
【第四步:選項分析】
(A) 為什麼錯?
✘ 錯
? 覆蓋舊資料會造成資料遺失
? 不符合同步設計原則
(B) 為什麼錯?
✘ 錯
? buffer 滿不是錯誤
? 是正常情況,不需要結束程式
(C) 為什麼對?
✔ 正確(本題答案)
? 正確做法:
使用 pthread_cond_wait() 等待條件改變
? 等 consumer 消費後再繼續
(D) 為什麼錯?
✘ 錯
? 這不是例外狀況
? 不需要拋出異常
【觀念補充與延伸】
核心觀念定位
? 作業系統 / 同步問題(Producer-Consumer)
? 經典必考題
標準邏輯(超重要)
? Producer:
pthread_cond_wait(¬_full, &mutex);
}
? Consumer:
pthread_cond_wait(¬_empty, &mutex);
}
兩個條件變數
| 條件 | 用途 |
|---|---|
| not_full | 生產者等待 |
| not_empty | 消費者等待 |
觸類旁通(舉一反三)
對比概念
-
semaphore vs condition variable
? semaphore 控制數量
? condition variable 控制狀態
變化題型
-
問:buffer 空時 consumer 怎麼辦?
? 等(wait)
【記憶口訣】
? 「滿了就等,空了再做」
【常見陷阱】
學生最容易搞混的地方
以為 buffer 滿是錯誤
心理盲點
直覺想「強制處理」
避坑指南
? 記住:
同步問題的核心是「等待」,不是「強做」