当前位置: 首页 > 编程笔记 >

如何使用信号量实现监视器?

督嘉言
2023-03-14
本文向大家介绍如何使用信号量实现监视器?,包括了如何使用信号量实现监视器?的使用技巧和注意事项,需要的朋友参考一下

为了使用信号量实现监视器,为每个监视器提供了一个信号量互斥锁(已初始化为1)。Wait(mutex)必须在进入监视器之前由进程执行,并且必须在离开监视器之后执行signal(mutex)。由于信令过程必须等待,直到恢复的过程离开或等待,所以引入了另一个信号量(下一步),初始化为0。信令过程可以使用next来挂起自身。还提供了一个整数变量next_count来计算next挂起的进程数。因此,每个外部功能F都由-

wait(mutex);
…
body of F
...
if (next_count > 0)
   signal(next);
else
   signal(mutex);

确保在监视器内相互排斥。现在让我们看看如何实现条件变量。对于每个条件x,我们引入一个信号量x _sem和一个整数变量x_count,它们都初始化为0。操作x.wait()现在可以实现为-

x_count++;
if (next_count > 0){
   signal(next);
}
   else {
   signal(mutex);
}
wait(x_sem);
x_count--;

操作x.signal()可以实现为-

if (x _count > 0){
   next_count++;
   signal(x_sem);
   wait(next);
   next_count--;
}
 类似资料:
  • 本文向大家介绍监视器与信号量,包括了监视器与信号量的使用技巧和注意事项,需要的朋友参考一下 监视器和信号灯用于进程同步,并允许进程使用互斥来访问共享资源。但是,监视器和信号灯包含许多差异。关于这两个的详细信息如下- 监控器 监视器是一种同步构造,旨在克服由信号量引起的问题,例如定时错误。 监视器是抽象数据类型,包含共享的数据变量和过程。共享数据变量不能由进程直接访问,并且需要过程才能允许单个进程一

  • 我很难从操作系统概念的信号量方面理解监视器的实现 5.8.3使用信号量实现监视器 我们现在考虑使用信号量的监视器机制的可能实现。 对于每个监视器,都提供一个信号量互斥(初始化为1)。进程在进入监视器之前必须执行等待(互斥),在离开监视器之后必须执行信号(互斥)。 由于信令进程必须等待,直到恢复的进程离开或等待,因此引入了一个额外的信号量,,初始化为0。信令进程可以使用来挂起自己。还提供了一个整数变

  • 在使用监视器的餐饮哲学家实现中,为什么提出()操作两次调用test()操作?

  • 本文向大家介绍Java 信号量Semaphore的实现,包括了Java 信号量Semaphore的实现的使用技巧和注意事项,需要的朋友参考一下 近日于LeetCode看题遇1114 按序打印,获悉一解法使用了Semaphore,顺势研究,记心得于此。 此解视Semaphore为锁,以保证同一时刻单线程的顺序执行。在此原题上,我作出如下更改。 10个线程的常量池中,分别调用R1,R2,R3的方法多次

  • 我正试图通过使用Mockito和监视对象,找出如何跳过单元测试中的非静态void方法调用。 正在讨论的类是: 我正在尝试的单元测试方法是: 在我的单元测试中,我尝试了下面概述的代码,但最终都在“doNot()”行之前抛出了Mockito错误(底部的详细错误): 错误: 任何帮助或建议将不胜感激!

  • 我需要监视多个文件夹以获取新文件通知。我尝试了一个目录,它工作得很好 我的文件夹结构类似于路径。获取(“c:\users\Test”);路径path1=路径。获取(“c:\users\test1”);路径路径2=路径。获取(“c:\users\test2”); 我尝试将每个目录注册到watcher。WatchKey key1=路径1。注册(观察者、条目和创建);WatchKey key2=路径2。