程序同步的三個經典問題

2021-09-01 20:48:09 字數 2783 閱讀 2203

要求:

producer和consumer,二者不能對buffer進行操作

當buffer滿的時候,就不允許producer繼續寫

當buffer空的時候,就不允許consumer繼續讀

訊號量及其初始化

semaphore mutex = 1; //buffer的鎖

semapore full = 0; //滿位的數量

semaphore empty = n; //空位的數量

producer簡單**描述

/*pv形式*/

while(true)

/*wait signal形式*/

while(true)

consumer簡單**描述

/*pv形式*/

while(true)

/*wait signal形式*/

while(true)

分析:

具有對稱性

先申請empty/full位,再申請緩衝區訪問許可權;先釋放mutex再釋放empty/full位

要求:

多個讀者,只能read,不能write

多個寫者,既能read,也能write

允許多個reader同時讀

不允許reader和writer同時操作

不允許多個寫者同時操作

本質:保證乙個writer程序必須與其他程序互斥地訪問共享物件

要求:?

太簡單了(以後再補)

要求:

有讀者在讀,則其他讀者可讀,直到沒有讀者了,寫者才能寫

有寫者在寫,則其餘寫者和讀者等待

訊號量及其初始化

int readercount = 0;//共享變數,記錄當前讀者的數量

semaphore mutex = 1;//readercount的鎖

semaphore m = 1;//buffer的鎖

writer簡單**描述

while(true)
reader簡單**描述

while(true)

signal(mutex);

//read

wait(mutex);

readercount--;

if(readercount==0)

signal(mutex);

}

要求:

寫者在寫,則其餘讀者和寫者等待;寫者寫完,優先釋放下乙個寫者

讀者在讀,若無寫者等待,則其他讀者可讀

讀者在讀,若有寫者等待,則其他讀者等待

訊號量及其初始化

int readercount = 0;//共享變數,記錄當前讀者的數量

int writecount = 0;//共享變數,記錄當前寫者的數量

semaphore mutex1 = 1;//readercount的鎖

semaphore mutex2 = 1;//writecount的鎖

semaphore read = 1;//buffer的讀鎖

semaphore write = 1;//buffer的寫鎖

semaphore s = 1;//為了讓寫者優先

writer簡單**實現

while(true)

signal(mutex2);

wait(write);

//write...

signal(write);

wait(mutex2);

writecount--;

if(writecount==0)

signal(mutex2);

}

reader簡單**實現

while(true)

signal(read);

signal(s);

//reading..

wait(mutex1);

readercount--;

if(readcounter==0)

signal(mutex1);

}

要求:

有5個哲學家

哲學家只能吃飯或者思考,不能同時進行

哲學家只能拿兩根筷子才能吃飯

semaphore chopstick[5]=;//筷子是否可用

semaphore seat=4;//可坐的位置

void philosppher(int i)

}

semaphore chopstick[5]=;//筷子是否可用

void philosppher(int i)

else

}}

借助and型訊號量,其基本思想是:將程序在整個執行過程中需要的所有資源一次性全部分配給程序,待程序使用完後再一起釋放。只要尚有乙個資源未能分配給程序,其他所有可能為之分配的資源也不分配給它。

semaphore chopstick[5]=;//筷子是否可用

void philosppher(int i)

}

程序同步三個常見問題

生產者 消費者 三個訊號量 empty 緩衝區 空閒 資源數,full 緩衝區 已滿 資源數 保證不會空時消費,滿時生產 保證順序 同步 mutex 代表互斥鎖 保證同一時間只有乙個執行緒可以訪問共享資源 互斥訪問 producer consumer 不能將執行緒裡兩個wait的交換順序,否則會出現...

經典程序同步問題

文章出處 http heikediguo2005.blog.163.com blog static 2211971200910254235533 依據訊號量與程序的關係,我們可把程序中使訊號量分成私用訊號量和公用訊號量。私有訊號量是指只與制約程序和被制約程序有關的訊號量 公用訊號量是指與一組併發程序...

經典程序同步問題

wait表示為訊號量減一,當訊號量不夠減時 訊號量 0 時 說明當前資源不足,發出資源請求的程序阻塞直到資源可達。signal 表示為訊號量加一,表示釋放了當前訊號量所指代的資源。兩者都是原子操作,不可打斷。生產者不停的向訊息佇列中生產訊息,消費者則不停的從訊息佇列中獲取訊息。當訊息佇列滿時,生產者...