与信号量或监视器进行同步是否更好?

2020年7月22日 43点热度 0条评论

与信号量或监视器进行同步是否更好?

解决方案如下:

“更好”取决于上下文。根据詹姆斯·麦克帕兰(James McParlane)的说法,他们“同样强大”。我强烈建议查看his blog for a discussion on the differences

这是我发现的快速指南:

信号量

  • 可以在程序中的任何位置使用,但不应在监视器中使用。
  • Wait()并不总是阻止调用方(即,当信号量计数器大于零时)。
  • Signal()释放一个阻塞的线程(如果有的话),或者增加信号量计数器。
  • 如果Signal()释放了阻塞的线程,则调用者和释放的线程都将继续。

  • 条件变量

  • 仅可用于监视器
  • Wait()始终阻止调用者。
  • Signal()释放一个阻塞的线程(如果有的话),或者信号丢失,好像永远不会发生。
  • 如果Signal()释放了阻塞的线程,则调用者将产生监视器(Hoare类型)或继续(Mesa类型)。调用者或已释放线程中只有一个可以继续,但不能两者都继续。
  • 该信息来自:
    http://www.cs.mtu.edu/~shene/NSF-3/e-Book/MONITOR/sema-vs-monitor.html

    一些有用的资源:

  • What is a Semaphore
  • Looking for Good Analogy Examples for Monitor Versus Semaphore
  • What are the differences between various threading synchronization options in C#?