通常谈论的信号量......它们是否涉及忙等待?我对术语感到困惑。请告诉我,我能够得出的结论中哪些是正确的。
a)自旋锁涉及忙等待,所以为了避免这种情况,我们有信号量。
b) 信号量是一种自旋锁,但我们可以在不忙于等待的情况下拥有信号量
c)pthread_condition 变量与信号量做同样的事情吗?如果是这样,它们是否等同于 semaphore.h 库中的信号量。如果两者都代表相同的功能,我会感到困惑。
通常谈论的信号量......它们是否涉及忙等待?我对术语感到困惑。请告诉我,我能够得出的结论中哪些是正确的。
a)自旋锁涉及忙等待,所以为了避免这种情况,我们有信号量。
b) 信号量是一种自旋锁,但我们可以在不忙于等待的情况下拥有信号量
c)pthread_condition 变量与信号量做同样的事情吗?如果是这样,它们是否等同于 semaphore.h 库中的信号量。如果两者都代表相同的功能,我会感到困惑。
抽象地说,信号量是一个带有许多与之关联的许可的锁。信号量支持两种操作:
有很多方法可以实现信号量。但是,通常情况下,信号量不是作为自旋锁实现的,实际上是让操作系统阻塞线程并让它休眠,直到请求的许可可用。也就是说,信号量的完全合法实现可能会使其忙于等待;我只是不知道这样做的任何实现。
条件变量代表一个不同的概念。通常,信号量旨在管理仅存在这么多副本的资源。每个想要该资源的线程都会等待,直到保护对它的访问的信号量变得可用,并且每个使用该资源的线程都拥有一个许可。条件变量通常用于允许线程等待某些事件发生。他们通常支持操作
条件变量和信号量(通常)可以互换使用,对锁使用的设计进行适当的更改。但是,有时信号量更容易使用,有时条件变量更容易使用,因此我们可以使用这两种原语。通常,由于您使用的特定库或语言,您会选择使用其中一种。例如,Java 对象具有对监视器的内置支持(条件变量与锁配对),因此在 Java 中使用条件变量通常很有用,尽管 Java 信号量确实存在。如果您在 Windows 中编程,那么信号量是首选的同步方法,尽管条件变量确实存在。
希望这可以帮助!
自旋锁使用忙等待,因此名称自旋 - 线程自旋什么都不做。
它的作用是“我可以进去吗?我可以进去吗?我可以进去……等等”,直到锁允许它进入临界区(CS)
信号量:通常使用信号/通知和队列来实现,因此当线程踩到信号量时,如果临界区中有另一个线程,它会进入睡眠状态并进入队列。如果 CS 中没有其他线程,则当前线程进入它。当另一个线程在 CS 中时踩到信号量的所有其他线程进入队列。当第一个线程退出 CS 时,它再次踏上信号量。信号量现在获取其队列中的第一个线程并将其唤醒,这反过来使线程进入 CS。
使用信号/等待实现的信号量,线程说我可以进去吗?如果不是,它会说我可以在我可以的时候叫醒我。如果是,它会进入。
编辑:信号量与条件
条件上的等待和信号操作与计数信号量的 P 和 V 操作非常相似。等待语句可以阻止线程的执行,而信号语句可以导致另一个线程的恢复。但是,它们之间存在差异。P 操作不一定阻塞线程,因为信号量计数器可能大于零。然而,wait 语句总是阻塞一个线程。信号语句可以使阻塞的线程在某个条件下就绪(解除阻塞),就像 V 操作使信号量上的阻塞线程就绪一样。不同之处在于 V 操作总是递增信号量计数器。从而影响后续的P操作。空条件上的信号语句不会影响后续的等待语句,因此会丢失。另一个区别是,如果执行了足够多的 V 操作,信号量上阻塞的多个线程可以立即恢复执行。在互斥体类型的情况下,多个信号语句确实解除了对多个线程的阻塞,但由于互斥体类型的互斥属性,这些线程中只有一个能够执行。