【发布时间】:2019-01-28 11:34:23
【问题描述】:
据我所知,线程可以在信号量上释放而无需先使用WaitOne 获取锁。
所以,如果我们有线程 A、B 和 C 以及一个信号量,A 和 B 调用 WaitOne,获取锁并开始执行它们的业务。
随之而来的是线程 C,它只在信号量上调用 Release。
这应该将信号量的计数加 1。这是否意味着信号量将终止 A 或 B,或者只允许第三个线程获取锁并在其池中拥有 3 个线程,即使最大值为 2?
【问题讨论】:
-
信号量不是活动对象;它不管理任何代码的运行。以有意义的方式使用它是程序员的责任。如果这意味着增加互斥,那是一个单独的问题——一个简单的计数信号量并不能解决这个问题。线程 C 流氓释放它不拥有的资源,是错误的。监视器是没有这个问题的更高级别的抽象,这就是为什么 .NET 代码中的原始信号量相当少的原因。对于更简单的场景,当只需要线程安全的计数器时,有
Interlocked。 -
在你执行线程之前你重置了两个信号量。然后在最后的线程内设置信号量。所以 C 除了等到两个信号量都设置好之外什么都不做。
-
@jdweng,让我们暂时假设我没有遵循良好的编程实践来为 Internet 站点上有关此类事情的特定问题提供理论场景。
-
@JeroenMostert,这是否意味着我对问题的假设是否正确?
-
是的,但是像往常一样,说服自己的最好方法是制作一个演示问题的小玩具应用程序(LINQPad 之类的工具使这变得非常容易)。我认为这比互联网上任何随机人的 cmets 都要好(当然更有洞察力)。虽然显示线程问题有时可能很棘手(有时完全不可能出现任何问题),但出于演示目的,在必要时插入几个
.Sleeps 通常会解决问题。
标签: c# multithreading semaphore