任何线程如何发出信号以释放二进制信号量

时间:2015-05-02 22:29:51

标签: multithreading concurrency locking mutex semaphore

我是多线程范例的新手。在学习并发性时,我发现的每个来源都说:

  

"互斥量和二进制信号量之间的区别在于所有权   也就是说,只有线程的人可以发信号通知互斥   创建它时,信号量可以通过任何线程发出信号"

考虑线程A已获取资源x上的二进制信号量锁并对其进行处理的情况。如果任何线程可以调用释放信号来锁定x,那么这就不会打开任何线程在线程A使用x时调用锁上释放的可能性。

是否存在不一致的范围,或者我遗漏了什么?

1 个答案:

答案 0 :(得分:1)

当然,如果线程任意获取或释放信号量,结果将是灾难性的,并且实现不会阻止这一点的事实并不意味着这是一个有用的场景。

但是,如果涉及的线程使用另一种机制来协调自己,同时使用信号量来保持这些线程不参与这些协调,则可能存在实际用例。

想象一下,您扩展了一个用例,其中一个线程获取信号量以执行任务以并行执行所述任务。在获取信号量之后,产生了几个工作线程,每个线程处理数据的不同部分,因此自然地工作不干扰。然后 last 工作线程释放信号量,这消除了在启动线程和工作线程之间进行另一次通信的需要。当然,这需要工作线程检测它是否是最后一个,但是一个包含活动工作者数量的简单原子整数就足够了。