在Semaphore vs. Monitors - what's the difference?中,
释放信号量的线程不一定是获得信号量的线程。
如果线程没有获得信号量,那么线程如何释放信号量?
这里的信号量是指在繁忙等待中实现的信号量,还是使用进程阻塞实现的信号量?
谢谢。
发布于 2016-10-28 13:45:08
信号量所涵盖的用例与互斥对象不同。
有了互斥物,你就对了。互斥通常用于防止代码中关键部分的并发执行。一个特定的线程将在关键部分开始时获取互斥对象,并在它再次离开关键部分时释放它。如果一个互斥对象被另一个线程释放,这将意味着关键部分跨越多个线程,这很可能不是您想要做的事情。
信号量的用例略有不同。它指示资源的可用性。需要使用资源的线程将获得信号量,该信号量在概念上是获取底层资源。如果没有可用的资源,则获取将阻止。
现在,在我们讨论一组固定资源(如一组可用的I/O端口)的场景中,获取线程再次释放资源也是有意义的。我获得了端口,做了一些工作,并在完成时释放了它,这样其他线程就可以在它上工作了。
但这并不是信号量的唯一用例。想想生产者/消费者:生产者线程可能提供资源(就像工作线程排队处理的项目一样),使用者线程会接受它们。在这些场景中,消耗的资源通常会消失,因此在获取资源后不会释放它们。相反,生成线程调用release以指示有可用的东西可供使用。然后,消费者调用获取来获取所产生的资源并对其进行处理。生产商永远不会呼叫收购,消费者也不会要求发布。
发布于 2016-10-28 13:28:39
在许多情况下,获得信号量的线程不能释放它,因为它被阻塞,等待某人释放信号量,而且必须是其他线程释放(信号)信号量。
在忙着等待的情况下实现信号量将是非常糟糕的。与锁不同的是,有些情况下信号保持很长时间(秒或分钟,小时可能有点不寻常,但绝对有可能)。
显然,对信号量对象的引用需要存储在另一个线程可以访问它的地方。
https://stackoverflow.com/questions/40306080
复制相似问题