生產者和消費者問題

2022-09-13 07:00:12 字數 863 閱讀 2327

生產者和消費者問題

生產者消費者問題(英語:producer-consumer problem),也稱有限緩衝問題(英語:bounded-buffer problem),是乙個多執行緒同步問題的經典案例。該問題描述了兩個共享固定大小緩衝區的執行緒——即所謂的「生產者」和「消費者」——在實際執行時會發生的問題。生產者的主要作用是生成一定量的資料放到緩衝區中,然後重複此過程。與此同時,消費者也在緩衝區消耗這些資料。該問題的關鍵就是要保證生產者不會在緩衝區滿時加入資料,消費者也不會在緩衝區中空時消耗資料。

分析問題:生產者和消費者共享同乙個緩衝池,同時訪問是可能會發生資料的不準確型。同一時間允許乙個程序進行訪問,即可解決問題。

利用記錄型訊號量解決問題

假設共享的緩衝池中有n個緩衝區,利用互斥型號量mutex實現對諸執行緒對緩衝池互斥訪問,訊號量empty和full分別表示空緩衝區的數量和滿緩衝區的數量。又假定只要有空緩衝區,生產者就能將資訊放入緩衝區,只要有滿緩衝區,消費者就能將資訊取出。

具體實現如下

1

intin = 0, out = 0;2

item buffer[n];

3 semaphore mutex=1, empty = n, full = 0;4

5void

producer()while(true)20

21}2223

void

consumer()while(true)38

}3940int

main()

41

標準紅色的**順序不能交換,如果交換了可能導致死鎖現象。假如生產者拿到訪問許可權mutex,但是緩衝區都滿了,生產者陷入等待緩衝區中,而消費者由於拿不到訪問許可權,而在一直等待中,造成死鎖。反之亦然

生產者和消費者問題

有乙個生產者在生產產品,這些產品將提供給若干個消費者去消費,為了使生產者和消費者能併發執行,在兩者之間設定乙個具有多個緩衝區的緩衝池,生產者將它生產的產品放入乙個緩衝區中,消費者可以從緩衝區中取走產品進行消費,顯然生產者和消費者之間必須保持同步,是即不允許消費者到乙個空的緩衝區中取產品,也不允許生產...

生產者和消費者問題

package 生產者消費者 public class producerconsumertest package 生產者消費者 生產者執行緒,負責生產公共資源 author dream public class producerthread implements runnable override ...

生產者和消費者問題

package com.softeem.lesson22.sync3 public class mobile public intgetnum public void setnum int num package com.softeem.lesson22.sync3 public class sto...