2012-02-06 114 views
2

通常所说的信号量......它们是否涉及到忙碌的等待?我对这个术语感到困惑。请告诉我,我能够画出的哪些结论是真实的。 a)Spinlocks涉及繁忙的等待,所以为了避免这种情况,我们有信号量。
b)信号量是一种自旋锁,但我们可以没有繁忙的等待信号量
c)pthread_condition变量与信号量做同样的事情吗?如果是这样,它们是否等同于semaphore.h库中的信号量。如果两者都代表相同的功能,我很困惑。
信号量术语

回答

4

抽象地说,信号量是一个带有许多许可证的锁。信号灯支持两种操作:

  1. 截至,增加许可的数量,并且
  2. ,它试图减少许可证的数量。如果没有足够的许可证,则该操作等待,直到有足够的许可证可用。

实现信号量有很多方法。但是,通常情况下,信号量不是作为自旋锁实现的,而是实际上让操作系统阻塞线程并让它休眠直到请求的许可证可用。也就是说,一个完全合法的信号量实现可能会让它忙碌 - 等待;我只是没有意识到任何这样做的实现。

条件变量表示不同的概念。通常,信号灯旨在管理只有这么多副本的资源。希望资源的每个线程都会等待,直到信号守护对它的访问变得可用,并且每个使用资源的线程都拥有一个许可。条件变量通常用于允许线程等待某些事件发生。他们通常支持业务

  1. 等待,这阻止线程,直到它发出信号,
  2. 通知,它讲述了一个线程等待条件变量,它可以继续,并
  3. 通知 - 全部,它告诉等待条件变量的所有线程可以继续。

条件变量和信号可以(通常)互换使用,并对锁的使用设计进行适当的更改。但是,有时信号量更容易处理,有时条件变量更容易处理,所以我们都有可用的基元。通常情况下,由于您使用的特定库或语言,您会选择使用一种。例如,Java对象内置支持监视器(与锁配对的条件变量),所以在Java中使用条件变量通常很有用,尽管Java信号量确实存在。如果您在Windows中进行编程,则信号量是首选的同步方法,但条件变量确实存在。

希望这会有所帮助!

+0

是的,所以我想知道如果你能给我的例子,以对比我可以使用它们 – 2012-02-06 03:58:13

+0

加上这个..我认为你的解释帮助。 http://stackoverflow.com/questions/3513045/conditional-variable-vs-semaphore – 2012-02-06 04:02:49

+0

POSIX符合性信号量不能等待,至少在实现支持优先级调度选项时不能等待,因为这样做会阻止低级别信号量的前进,优先级线程。 – 2012-02-06 04:33:19

0

自旋锁使用繁忙的等待,因此名称自旋 - 线程自旋无所事事。

它所做的是“?我可以去我可以去我可以进去......等”,直到锁允许它在关键部分(CS)

信号灯:通常使用信号/通知和队列来实现,因此当线程在信号量上进入睡眠状态时,如果临界区域中有另一个线程,则进入队列。如果CS中没有其他线程,则当前线程输入它。当另一个线程在CS中时,所有其他线程在信号量上进入队列。当第一个线程退出CS时,它会再次触发信号量。信号量现在将其队列中的第一个线程唤醒并唤醒它,从而使线程进入CS。

在signal/wait实现的信号量时,线程说我可以进去吗?如果不是,它说,当我可以时叫醒我。如果是的话,它会在

编辑:信号灯VS条件

上条件的等待和信号操作是非常相似的P和V操作上计数信号。等待语句可以阻塞线程的执行,而信号语句可以导致重新启动另一个线程。但是,它们之间存在差异。 P操作不一定会阻塞一个线程,因为信号量计数器可能大于零。然而,等待语句总是阻塞一个线程。信号语句可以在一个条件下准备好(解除阻塞)阻塞的线程,就像V操作为信号量上的阻塞线程做好准备一样。区别在于V操作总是增加信号量计数器;从而影响后续的P操作。空条件下的信号语句不会影响后续的等待语句,因此会丢失。另一个区别是,如果执行足够的V操作,信号量上被阻塞的多个线程可以立即恢复执行。在互斥类型的情况下,多个信号语句可以解锁多个线程,但由于互斥类型的互斥属性,只能有一个线程能够执行。

+0

请解释与cond vars的对比 – 2012-02-06 03:56:44