您的位置:首页 > 其它

互斥与同步(二)

2014-02-22 07:29 267 查看
一、管程

1、定义:管程是由一个或多个过程、一个初始化序列和局部数据组成的软件模块,主要特点如下:

局部数据变量只能被管程的过程访问。
进程通过调用管程的一个过程进入管程。
任何时候,只能有一个进程在管程中执行,调用管程的任何其他进程被挂起。

2、函数

cwait(c):调用进程的执行在条件c 上被挂起,管程现在可被另一个过程使用。——进入条件队列

csignal(c):恢复在cwait 之后为某些条件而挂起的进程的执行。——从条件队列中取出一个

3、例子

生产者-消费者问题

cond notfull,notempty;
void append(char x)
{
if(count == N)
cwait(notfull);
count ++;
csignal(notempty);
}
void take(char x)
{
if(count==0)
cwait(notempty);
count --;
csignal(notfull);
}
二、消息传递

使用消息传递解决生产者-消费者问题

void producer()
{
message pmsg;
while(true)
{
receive(mayproduce,pmsg);
pmsg = produce();
send(mayconsumer,pmsg);
}
}
void consumer()
{
message cmsg;
while(true)
{
receive(mayconsumer,cmsg);
consume(cmsg);
send(mayproduce,null);
}
}
其中,mayproduce是生产者信箱,而mayconsumer是消费者信箱。


三、读者-写者问题

1、定义:有一个许多进程共享的数据区,满足以下条件,

任意多的读进程可以同时读这个文件。
一次只有一个写进程可以往文件中写。
如果一个写进程正在往文件中写时,则禁止任何读进程读文件。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: