wait表示為訊號量減一,當訊號量不夠減時(訊號量 <= 0 時),說明當前資源不足,發出資源請求的程序阻塞直到資源可達。
signal 表示為訊號量加一,表示釋放了當前訊號量所指代的資源。兩者都是原子操作,不可打斷。
生產者不停的向訊息佇列中生產訊息,消費者則不停的從訊息佇列中獲取訊息。當訊息佇列滿時,生產者阻塞。當訊息佇列空時,消費者堵塞。訊息隊列為互斥使用。
int
in = 0, out = 0; // in代表插入訊息的位置,out代表取得訊息的位置
item buffer[n]; //訊息佇列,儲存容量為n
int mutex = 1; //訊息佇列互斥量,由於只有乙個訊息佇列,故為1
int full = 0 , empty = n; // full記錄當前存入的訊息個數,empty代表佇列當前空位個數
void producer()
}void consumer()
}
寫者不停的向訊息池裡寫入訊息,當寫入時是不允許讀取。這裡就需要乙個互斥量了。讀者在寫者空閒時會讀取訊息,且允許多個讀者同時讀取訊息,因此就需要乙個readcount變數記錄當前讀者的個數。當readcount為0時,寫者可以佔據訊息池並進行寫入
int readcount = 0; //記錄讀者的個數
int readcountmutex = 1; // readcount變數互斥量,當多個讀者讀入變數時,勢必出現併發修改的問題,因此需要控制一下
int msgpoolmutex = 1; //訊息池互斥量,寫時不能讀,讀時不能寫
void reader()
readcount++; //讀者數量加一,並釋放readcount的修改權
signal(readcountmutex); //釋放readcount的修改權
reading....
wait(readcountmutex); // 鎖定readcount的修改權
readcount--; // 讀完了,讀者數減一
if(readcount == 0)
signal(readcountmutex); //釋放readcount的修改權
}void writer()
}
經典程序同步問題
文章出處 http heikediguo2005.blog.163.com blog static 2211971200910254235533 依據訊號量與程序的關係,我們可把程序中使訊號量分成私用訊號量和公用訊號量。私有訊號量是指只與制約程序和被制約程序有關的訊號量 公用訊號量是指與一組併發程序...
經典程序同步問題
生產者消費者問題 是同步互斥的綜合。乙個生產者程序和乙個消費者程序共享乙個初始為空 大小為n的緩衝區。緩衝區沒滿生產者才能放東西,緩衝區不空消費者才能取東西。設定三個訊號量,mutex表示對緩衝區的互斥訪問,初值為1。empty表示還沒有被訊息佔據的緩衝區大小,初值為n。full表示已經被訊息佔據的...
經典程序同步問題 十
哲學家就餐問題可以這樣表述,假設有五位哲學家圍坐在一張圓形餐桌旁,做以下兩件事情之一 吃飯,或者思考。吃東西的時候,他們就停止思考,思考的時候也停止吃東西。餐桌中間有一大碗義大利面,每兩個哲學家之間有乙隻餐叉。因為用乙隻餐叉很難吃到義大利面,所以假設哲學家必須用兩隻餐叉吃東西。他們只能使用自己左右手...