c 中生產者消費者問題

2021-09-30 05:13:45 字數 2536 閱讀 7057

//乙個同步程式,生產者向乙個緩衝區(定義為三個位元組)中寫入資料,消費者從中提取數

//據,如果緩衝區中沒有資料,那麼consumer只好wait,進入等待狀態,當另乙個執行緒(也就是

//生產者)向緩衝區中寫入資料猴,執行了monitor.pulse,喚醒了consumer的等待,開始讀取

//資料.反之,當producer寫入資料的時候,如果緩衝區已滿,那麼只好進入等待狀態,當另一

//個執行緒(也就是消費者)從中讀取了資料,緩衝區有了空間,那麼消費者執行

喚醒生產者,繼續寫入資料.

//程式使用了lock來鎖定共享資料區,而不是使用monitor.enter和monitor.exit,因為你可

//能很容易忘記enter後exit掉,而lock則是隱式的執行了exit,所以建議用lock.

//當然,在程式執行的過程中,因為是執行緒,所以執行結果是不可再現的!!每次可能執行的順

//序有很多種!!

//定義了四個類:

//第乙個類letsynchronized,主要用來訪問資料,並且在訪問的時候,加上了共享鎖.

//第二個類producer,生產者,呼叫乙個letsynchronized類的例項的setbuffer方法來存放

//資料.

//第三個類consumer,消費者, 呼叫乙個letsynchronized類的例項的getbuffer方法來存放

//資料.

//第四個類threadstart,測試類,也是這個cs中的啟動類,定義了letsynchornized例項,然

//後傳遞給了producer和consumer,然後定義了兩個執行緒,執行緒啟動的是producer

//的produce方法和consumer的consume方法,最後啟動這兩個執行緒.

using system;

using system.threading;

//letsynchronized用來存放和取出緩衝區變數

public class letsynchronized

;//定義了只有三個位元組的緩衝區

private int buffercount=0;

//確認緩衝區內已放數值的個數

private int readlocation=0,writelocation=0;

//確定讀寫的位置

public letsynchronized()

public int getbuffer()

//判斷如果緩衝區內無內容,則consumer進入wait狀態,並且釋放物件鎖

int readvalue=buffer[readlocation];

buffercount--;

//已經從緩衝區讀取了內容,所以buffercount要進行自減.

readlocation=(readlocation+1)%buffer.length;

//求餘的目的是為了迴圈使用緩衝區

monitor.pulse(this);

//通知物件的第乙個等待執行緒可以從waitsleepjoin轉換到started狀態.

return readvalue;

//返回給consumer取出的數值}}

public void setbuffer(int writevalue) //將資料放入緩衝區

//如果緩衝區已滿,那麼進入waitsleepjoin狀態

buffer[writelocation]=writevalue;

//向緩衝區寫入資料

buffercount++;

//自加,代表緩衝區現在到底有幾個資料

writelocation=(writelocation+1)%buffer.length;

//用%實現緩衝區的迴圈利用

monitor.pulse(this);

//喚醒waitsleepjoin狀態的程序,到started狀態

}//使用lock隱式的釋放了共享鎖}}

public class producer //生產者類,向緩衝區中放入資料

//此處建構函式的作用是在啟動類中呼叫producer的時候,把啟動類中定義的sharedlocation傳過來

public void produce()//定義生產過程

//將資料放入緩衝區

string name=thread.currentthread.name;

//得到當前執行緒的名字

console.writeline(name+"done producing");

//此執行緒執行完畢}}

public class consumer//定義消費者類

//定義建構函式,負責傳遞啟動類中的shared

public void consume()

//從緩衝區中迴圈讀取

string name=thread.currentthread.name;

//取得當前執行緒的名字

console.writeline(name+"done consuming");}}

public class threadtest //設定為啟動類

Linux 中生產者與消費者問題

條件變數condition variable 乙個condition variable總是和乙個mutex搭配使用的。乙個執行緒可以呼叫pthread cond wait在乙個condition variable上阻塞等待,這個函式做以下三步操作 釋放mutex 不滿足條件時必須進行休眠 進行阻塞式...

執行緒中生產者和消費者

package com.thread.p c public class valueobject package com.thread.p c public class p public void setvalue string value system.currenttimemillis syste...

生產者消費者問題

public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...