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

Multithreading 它是什么意思';释放信号量的线程不一定是获取信号量的同一线程';?,multithreading,semaphore,Multithreading,Semaphore,在, 释放信号量的线程不必与释放信号量的线程相同 获得了它 如果线程没有获取信号量,那么线程如何释放信号量 这里的信号量是指用忙等待实现的信号量,还是用进程阻塞实现的信号量 谢谢。在许多情况下,获取信号量的线程无法释放信号量,因为它在等待有人释放信号量时被阻塞,并且必须是其他线程释放(发送信号)信号量 在繁忙等待的情况下实现信号量将是非常糟糕的。与锁不同的是,在某些情况下,信号量保持很长时间(秒或分钟,小时可能有点不寻常,但绝对可能) 显然,对信号量对象的引用需要存储在另一个线程可以访问它的地方

在,

释放信号量的线程不必与释放信号量的线程相同 获得了它

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

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


谢谢。

在许多情况下,获取信号量的线程无法释放信号量,因为它在等待有人释放信号量时被阻塞,并且必须是其他线程释放(发送信号)信号量

在繁忙等待的情况下实现信号量将是非常糟糕的。与锁不同的是,在某些情况下,信号量保持很长时间(秒或分钟,小时可能有点不寻常,但绝对可能)


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

信号量覆盖的用例与互斥量不同

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

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

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

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