05并发性互斥和同步 .pptVIP

  • 15
  • 0
  • 约 94页
  • 2017-03-08 发布于重庆
  • 举报
05并发性互斥和同步

* * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * 无限缓冲区的 二元信号量 解决方案 int n; /*缓冲区中产品数*/ Binary_semaphore s 1; /*互斥*/ Binary_semaphore delay 0; /*等待*/ void producer while true produce ; semWaitB s ; append ; n++; if n 1 semSignalB delay ; semSignalB s ; void consumer semWaitB delay ; while true semWaitB s ; take ; n--; semSignalB s ; consume ; if n 0 semWaitB delay ; 少执行一次 void main n 0; parbegin producer, consumer ; 存在漏洞:超前消费 切换→ * 基于二元信号量的正确解决方案 int n; Binary_semaphore s 1; Binary_semaphore delay 0; void producer while true produce ; semWaitB s ; append ; n++; if n 1 semSignalB delay ; semSignalB s ; void consumer int m; semWaitB delay ; while true semWaitB s ; take ; n--; m n; semSignalB s ; consume ; if m 0 semWaitB delay ; * 基于计数信号量的正确解决方案 semaphore n 0; /*缓冲区中的产品数*/ semaphore s 1; /*互斥*/ void producer while true produce ; semWait s ; append ; semSignal s ; semSignal n ; void consumer while true semWait n ; semWait s ; take ; semSignal s ; consume ; void main parbegin producer, consumer ; 颠倒顺序后 会产生死锁 有限缓冲区的生产者/消费者问题 对象 被阻塞事件 解除阻塞事件 生产者 插入满缓冲区 消费者移出一项 消费者 从空缓冲区移出 生产者插入一项 * * 有限循环缓冲区的解决方案 const int sizebuffer N semaphore n 0; /*产品数*/ semaphore s 1; /*互斥*/ semaphore e N; /*空闲数*/ void producer while true produce ; semWait e ; semWait s ; append ; semSignal s ; semSignal n ; void consumer while true semWait n ; semWait s ; take ; semSignal s ; semSignal e ; consume ; void main parbegin producer, consumer ; * 理发店问题 用信号量或管程实现并发的经典例子(参见P511的附录A.3) 问题描述: 3个理发师、 3张理发椅、一张沙发4个位、一个收银机、室内最多容纳20个顾客、共有50个顾客,有位则坐,无位则站 * 动机 同步机制与同步策略的分离是灵活的,同时也是危险的 集中管理(封装)以策安全 管程 monitor 是一种封装同步机制与同步策略的程序设计语言结构 Ada 95、并发Pascal、Modula-3、Java、C#、Delphi、Python、Ruby、Mesa等 1972年由英国计算机科学家C.A.R. Hoare和美籍丹麦计算机科学家P.B. Hansen发明 5 .4 管程 * 1974年Hoare提出的管程方案 1975年Hansen在并发Pascal上实现 主要特点: 本地变量只能由管程过程访问(封装) 进程通过调用管程过程进入管程(调用) 每次只能一个进程在执行相关管程的过程(互斥) 主要缺陷 可能增加了两次多余的进程切换 对进程调度有特殊要求(不允许插队) 5 .4.1 使用信号的管程 管程的结构和应用

文档评论(0)

1亿VIP精品文档

相关文档