"释放信号量的线程不一定是获取它的同一线程"是什么意思?



在信号量与监视器-有什么区别?

释放信号量的线程不必与释放信号量的线程相同收购了它。

如果一个线程没有获取信号量,那么该线程如何释放信号量?

这里的信号量是指用繁忙等待实现的信号量,还是用进程阻塞实现的信号量?

谢谢。

信号量涵盖了与互斥锁不同的用例。

对于互斥锁,你是对的。互斥锁通常用于防止代码中临界区的并发执行。特定线程将在临界区开始时获取互斥锁,并在再次离开临界区时释放它。如果一个互斥锁是由不同的线程释放的,而不是由获得它的线程释放的,这意味着临界区跨越了多个线程,这很可能不是你想要的。

信号量的用例略有不同。它表示资源的可用性。需要消耗资源的线程将获取信号量,这在概念上是获取底层资源。如果没有可用的资源,获取将阻塞。

现在,在我们讨论一组固定的资源(如一组可用的I/O端口)的场景中,获取线程再次释放资源是有意义的。我获得端口,做一些工作并在完成后释放它,以便其他线程可以在其上工作。

但这不是信号量的唯一用例。想想生产者/消费者:生产者线程可能提供资源(比如排队等待工作线程处理的项目),而消费者线程将接受它们。在这些场景中,消耗的资源通常会消失,因此在获取资源后不会释放资源。相反,生产线程调用release来指示有可用的东西可供消费。然后,消费者调用acquire来声明生成的资源并对其进行处理。生产者永远不会调用acquire,消费者永远不会调用release。

在许多情况下,获得信号量的线程不能释放它,因为它被阻塞等待某人释放信号量,并且它必须是释放(发出信号)信号量的其他线程。

实现带有繁忙等待的信号量将是绝对可怕的。与锁不同的是,有些情况下信号量会被持有很长一段时间(秒或分钟,小时可能有点不寻常,但这是完全可能的)。

显然,对信号量对象的引用需要存储在另一个线程可以访问的地方。

相关内容

最新更新