在Semaphore vs. Monitors - what's the difference?,
释放信号量的线程不必是同一个线程 获得了它。
如果线程没有获取信号量,那么线程如何释放信号量?
这里的信号量是否意味着在忙碌等待时实现的信号量,或者是通过进程阻塞实现的信号量?
感谢。
答案 0 :(得分:2)
信号量涵盖的不同用例不同于互斥锁。
使用互斥锁,你会是对的。互斥锁通常用于防止代码中关键部分的并发执行。特定线程将在临界区的开头获取互斥锁,并在它再次离开临界区时释放它。让一个互斥体被一个不同的线程释放而不是获得它的那个线程意味着关键部分跨越多个线程,这很可能不是你想要做的事情。
信号量的用例略有不同。它表示资源的可用性。需要使用资源的线程将获取信号量,该信号量在概念上获取底层资源。如果没有可用资源,则获取将阻止。
现在,在我们讨论固定资源集(如一组可用I / O端口)的情况下,获取线程也可以再次释放资源。我获取端口,做一些工作并在完成后释放它,以便其他线程可以对其进行操作。
但这不是信号量的唯一用例。想想生产者/消费者:生产者线程可能提供资源(如排队等待工作线程处理的项目),而消费者线程将接受它们。在这些情况下,消耗的资源通常会消失,因此您在获取资源后不会释放资源。相反,生成线程调用release以指示有可供使用的东西。然后,消费者呼叫获取以声明生产的资源并对其进行处理。生产者永远不会打电话给收购,消费者永远不会打电话给发布。
答案 1 :(得分:1)
在许多情况下,获取信号量的线程无法释放它,因为它被阻止等待某人释放信号量,并且它必须是其他一些线程释放(信令) )信号量。
在忙碌的等待中实现信号量非常糟糕。与锁不同,有些情况下信号量持续很长时间(几秒或几分钟,小时会有点不寻常,但绝对可能)。
显然,对信号量对象的引用需要存储在另一个线程可以访问它的地方。