38 在生產者消費者問題中,當緩衝區已滿時,生產者應該採取什麼動作?
(A) 繼續生產並覆蓋舊資料
(B) 結束程式執行
(C) 調用pthread_cond_wait()等待
(D) 直接拋出異常

答案:登入後查看
統計: A(0), B(0), C(8), D(0), E(0) #3399885

詳解 (共 2 筆)

#7318888

【第一步:找關鍵字】

關鍵字:

  • 生產者消費者問題(Producer-Consumer)

  • 緩衝區已滿(buffer full)

  • 生產者(producer)

  • 等待(關鍵動作)

? 核心觀念:
滿了不能再放 → 必須等

【第二步:白話翻譯】

這題在問:

? 「如果生產者想放東西,但緩衝區已經滿了,應該怎麼辦?」

【第三步:解題思路】

這題在考什麼觀念?

? 同步機制(condition variable / blocking)

解題步驟

  1. 判斷 buffer 狀態(已滿)

  2. 思考能不能再放 → 不行

  3. 正確行為 → 等

原理與規則(生活比喻)

把 buffer 想成「飲料販賣機」:

  • 已經塞滿飲料了

  • 補貨員(producer)來了

? 能不能硬塞?

❌ 不行(會壞掉)

? 正確做法:

? 等有人買掉(consumer 消費)

【第四步:選項分析】

(A) 為什麼錯?

✘ 錯

? 覆蓋舊資料會造成資料遺失

? 不符合同步設計原則

(B) 為什麼錯?

✘ 錯

? buffer 滿不是錯誤

? 是正常情況,不需要結束程式

(C) 為什麼對?

✔ 正確(本題答案)

? 正確做法:

使用 pthread_cond_wait() 等待條件改變

? 等 consumer 消費後再繼續

(D) 為什麼錯?

✘ 錯

? 這不是例外狀況

? 不需要拋出異常

【觀念補充與延伸】

核心觀念定位

? 作業系統 / 同步問題(Producer-Consumer)
? 經典必考題

標準邏輯(超重要)

? Producer:

ㅤㅤ
while (buffer 滿) {
pthread_cond_wait(&not_full, &mutex);
}
ㅤㅤ

? Consumer:

ㅤㅤ
while (buffer ) {
pthread_cond_wait(&not_empty, &mutex);
}
ㅤㅤ

兩個條件變數

條件 用途
not_full 生產者等待
not_empty 消費者等待

觸類旁通(舉一反三)

對比概念

  • semaphore vs condition variable
    ? semaphore 控制數量
    ? condition variable 控制狀態

變化題型

  • 問:buffer 空時 consumer 怎麼辦?
    ? 等(wait)

【記憶口訣】

? 「滿了就等,空了再做」

【常見陷阱】

學生最容易搞混的地方

以為 buffer 滿是錯誤

心理盲點

直覺想「強制處理」

避坑指南

? 記住:

同步問題的核心是「等待」,不是「強做」

0
0
#6786485
1. 題目解析 在生產者-消費者問題中,...
(共 897 字,隱藏中)
前往觀看
0
0