线程 事件栅栏

mdqy195905 2009-07-14 04:59:38
2.1实现事件栅栏原语(30分)
2.1.1事件栅栏的概念
 事件栅栏(EventBarrier)是一种同步机制,使用事件栅栏可以让一组线程以同步的方式等待和应答某事件。
 事件栅栏的调用者分为两类:或者调用Wait操作,或者调用Signal操作。使用事件栅栏,无论是Wait操作的调用者或者是Signal操作的调用者最终都将同步地通过栅栏(如果他们原先不同步,则进度较快的线程将通过使自己阻塞而与进度慢的线程同步)。
 Wait操作的调用者在事件栅栏上等待Signal的发出。
 和信号量类似,Signal操作是可以积累的——没有Waiter的Signal将被记录下来。
 执行Wait操作的调用者在收到Signal后必须应答Signal的发出者——调用Complete操作表示应答结束。
 只有在所有的Wait操作的调用者都已经应答后,它们才能通过事件栅栏。在所有的Wait操作的调用者都已经应答之前,Signal的发出者必须等待,并保持事件栅栏处于“SIGNALED”状态。类似地,也只有在所有的Wait操作的调用者都已经应答后,Signal的发出者才能离开事件栅栏,并恢复事件栅栏的初始状态“UNSIGNALED”。
 只允许一个Signal操作的调用者发出Signal并等待应答。
2.1.2实现事件栅栏的几点注意
 EventBarrier类的接口定义和实现应分别包含在EventBarrier.h和EventBarrier.cc中,请自己新建这些文件,并注意修改Makefile文件nachos-3.4/code/Makefile.common里的有关部分(具体项目可以参考实验一的说明)。
 EventBarrier类的主要外部接口的简要说明请参考nachos-labs.pdf的3.3.1。
 Signal操作的主要步骤:
 设置事件栅栏的状态为SIGNALED
 唤醒所有阻塞于Signal的线程
 阻塞于Complete
 恢复事件栅栏的状态为UNSIGNALED
 Wait操作的主要步骤:
 如果事件栅状态是SIGNALED,则直接返回
 否则,阻塞于Signal
 Complete操作的主要步骤:
 如果是最后一个调用Complete者,则唤醒所有阻塞于Complete的线程
 否则,阻塞于Complete
 建议使用条件变量来实现(因为需要广播)

请问一下,这个用Java怎么实现。实在不好意思在CSDN上发作业贴,可是我对线程的理解不很透彻,有谁帮帮忙的~。写下代码,谢谢了~!
...全文
312 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
超维电脑科技 2009-07-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 bolink5 的回复:]
友情帮顶
up
[/Quote]
up
冰思雨 2009-07-15
  • 打赏
  • 举报
回复
顶2楼滴
bolink5 2009-07-14
  • 打赏
  • 举报
回复
友情帮顶
up
爱摸鱼de老邪 2009-07-14
  • 打赏
  • 举报
回复
java.util.concurrent包好像提供了这个机制的实现了吧,你好好去看看,java.util.CyclicBarrier及其相关类与接口,然后再翻翻源码。
yanhan0615 2009-07-14
  • 打赏
  • 举报
回复
这个要说起来很复杂了,你可以看看jdk的源码,关于EventDispatch类的实现方法,应该就是你要的东西

62,621

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧