正確答案:
-
問題類型:
經典生產者 - 消費者問題?同時涉及同步和互斥。- 同步:生產者與消費者通過信號量協調生產 / 消費節奏(如緩沖區滿時生產者等待,空時消費者等待)。
- 互斥:對共享緩沖區的訪問需互斥(避免數據沖突)。
-
程序補充:
-
信號量初值:
buffer = n
(緩沖區空閑位置數,初值為緩沖區大小);
product = 0
(緩沖區產品數,初值為 0);
mutex = 1
(互斥鎖,初值為 1)。 -
生產者代碼:
while(true){生產一產品;wait(buffer); // (1) 等待緩沖區有空閑(可放入產品)wait(mutex); // (2) 申請緩沖區訪問權(互斥)往Buffer[in]放產品;in = (in+1)%n;signal(mutex); // 釋放緩沖區訪問權signal(product); // (3) 通知消費者有產品 }
-
消費者代碼:
while(true){wait(product); // (4) 等待緩沖區有產品(可消費)wait(mutex); // (5) 申請緩沖區訪問權(互斥)從Buffer[out]取產品;out = (out+1)%n;signal(mutex); // 釋放緩沖區訪問權signal(buffer); // (6) 通知生產者有空閑位置消費一產品; }
-
解析:
-
同步機制:
- 生產者通過?
wait(buffer)
?確保緩沖區未滿(有空閑位置時才生產),生產后用?signal(product)
?告知消費者 “有產品可消費”。 - 消費者通過?
wait(product)
?確保緩沖區非空(有產品時才消費),消費后用?signal(buffer)
?告知生產者 “有空閑位置可生產”。
- 生產者通過?
-
互斥機制:
mutex
?信號量保證同一時刻只有一個進程(生產者或消費者)訪問緩沖區(放入 / 取出產品),避免數據競爭(如生產者寫入時消費者同時讀取導致數據混亂)。
-
信號量邏輯驗證:
- 初始時,
buffer = n
(全空,生產者可連續生產?n
?次,每次?wait(buffer)
?消耗 1,signal(buffer)
?增加 1)。 product = 0
(無產品,消費者需等待,直到生產者?signal(product)
?后才開始消費)。mutex = 1
(首次訪問緩沖區時,wait(mutex)
?使信號量為 0,后續進程需等待,確保互斥)。
- 初始時,