//使用二元信號量解決無限緩沖區的生產者消費者問題int count = 0; //count為緩沖區中的資料項個數BinSem s = 1, delay = 0; //s為二元信號量,控制生產者和消費者進入臨界區; //delay為二元信號量,處理緩沖區為空的情況;void producer(){ while(1){ produce(); semWaitB(s); append(); count++; if(count==1)semSignalB(delay); //緩沖區非空,喚醒消費者行程 semSignalB(s); }} void consumer(){ semWaitB(delay); while(1){ semWaitB(s); take(); count--; m = count; semSignalB(s); consume(); //用到m是因為此時在臨界區外,在執行下面一條陳述句之前count可能已經被更新,導致delay不匹配 if(m==0)semWaitB(delay); //緩沖區已空,阻塞消費者行程 } }
————————————————
例程如上,但是要是在初始時直接進入消費程式之中count的值不就直接成了-1提前消費出現錯誤了嗎?
uj5u.com熱心網友回復:
//使用二元信號量解決無限緩沖區的生產者消費者問題int count = 0;
//count為緩沖區中的資料項個數BinSem s = 1, delay = 0;
//s為二元信號量,控制生產者和消費者進入臨界區;
//delay為二元信號量,處理緩沖區為空的情況;
void producer()
{
while(1)
{ produce();
semWaitB(s);
append();
count++;
if(count==1)semSignalB(delay); //緩沖區非空,喚醒消費者行程
semSignalB(s);
}
}
void consumer()
{
semWaitB(delay);
while(1){
semWaitB(s);
take();
count--;
m = count;
semSignalB(s);
consume(); //用到m是因為此時在臨界區外,在執行下面一條陳述句之前count可能已經被更新,導致delay不匹配
if (m==0)semWaitB(delay); //緩沖區已空,阻塞消費者行程
}
}
代碼如上
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/63244.html
標籤:系統維護與使用區
上一篇:linux檔案權限和群組
