互斥与同步(二)

一、管程

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、定义:有一个许多进程共享的数据区,满足以下条件,

  • 任意多的读进程可以同时读这个文件。
  • 一次只有一个写进程可以往文件中写。
  • 如果一个写进程正在往文件中写时,则禁止任何读进程读文件。

      




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值