天天看點

漢森實作管程的執行個體

一、管程來解決生産者/消費者問題

1)

[objc] view plain copy 在CODE上檢視代碼片派生到我的代碼片

Struct Monitor

{

condition NF,NE;

int Buffer[n];

int k = 0,t = 0,count = 0;

define Add(int),Remove(int);

use wait(),signal(),check(),release();

void init() //初始化局部變量和條件變量

{

count = 0;k = 0;t = 0;NF = 0;NE = 0;

}

vodi Add(int i)

{

check();

if(count ==n) wait(NF);

Buffer[k] = i;

k = (k+1)%n;

count++;

signal(NE);

release();

}

void Remove(int &i)

{

check();

if(count == 0)wait(NE);

i = Buffer[t];

t = (t+1)%n;

count–;

signal(NF);

release();

}

}

[objc] view plain copy 在CODE上檢視代碼片派生到我的代碼片

process producteri()//i = 1,2…,m

{

int x;

x = 生産一個産品(整數)

Add(x);

}

process consumerj()//j = 1,2,…,r

{

int x;

Remove(x);

消費該産品(整數);

}

二、用管程來解決優先寫着的讀者/寫着問題

優先寫者的讀者/寫着問題要求是:

①讀者共享;

②寫着互斥;

③有讀者在讀,寫着不可寫;

④寫着在寫,讀者不可讀;

⑤當讀者在讀時,寫着提出寫的要求,後面的讀者就不允許進入讀檔案;

⑥當裡面的讀者讀完時,由寫着進入寫;

⑦當寫着寫完後,優先喚醒等待的寫着,如果沒有寫着等待,才喚醒等待的讀者進行讀;

1)

[objc] view plain copy 在CODE上檢視代碼片派生到我的代碼片

struct Monitor

{

condition RR,WW;

int ReaderCnt,WriterCnt;

define StartRead,EndRead,StartWrite,EndWrite;

use wait,signal,check,release;

void StartRead()

{

check();

if(WriterCnt>0)wait(RR);

ReaderCnt++;

signal(RR);

release();

}

void EndRead()

{

check();

ReaderCnt–;

if(ReaderCnt == 0)signal(WW);

release();

}

void StartWrite()

{

check();

WriterCnt++;

if(ReadCnt>0 || WriterCnt>1)wait(WW);

release();

}

void EndWrite()

{

check();

WriterCnt–;

if(WriterCnt>0)signal(WW);

else

signal(RR);

release();

}

void init()

{

ReaderCnt=0;WriterCnt=0;RR=0;WW=0;

}

}

[objc] view plain copy 在CODE上檢視代碼片派生到我的代碼片

process reader()

{

ReadWriter.StartRead();

讀檔案;

ReadWriter.EndRead();

}

process writer()

{

ReadWriter.StartWrite();

寫檔案;

ReadWriter.EndWrite();

}

繼續閱讀