信号量术语

时间:2012-02-06 03:18:59

标签: c pthreads semaphore condition-variable

通常谈到信号量......它们是否涉及忙碌的等待?我对术语感到困惑。请告诉我,我能够绘制的哪些结论是真的。

a)自旋锁涉及繁忙的等待,所以为了避免这种情况,我们有信号量 b)信号量是一种自旋锁,但我们可以在没有忙等待的情况下拥有信号量 c)pthread_condition变量与信号量做同样的事情?如果是这样,它们是否等同于semaphore.h库中的信号量。如果两者代表相同的功能,我会感到困惑。

2 个答案:

答案 0 :(得分:4)

抽象地说,信号量是一个具有许多与之关联的许可证的锁。信号量支持两种操作:

  1. 向上,这会增加许可数量,
  2. 向下,试图减少许可数量。如果没有足够的许可证,则此操作将等待,直到有足够的许可证。
  3. 有很多方法可以实现信号量。但是,通常情况下,信号量不是作为自旋锁实现的,实际上OS会阻塞线程并使其休眠直到请求的许可证可用。也就是说,一个完全合法的信号量实现可能会让它忙碌等待;我只是不知道有任何实现这样做。

    条件变量代表不同的概念。通常,信号量旨在管理仅存在这么多副本的资源。每个想要资源的线程都会等待,直到信号量保护对它的访问变为可用,并且使用该资源的每个线程拥有一个许可。条件变量通常用于允许线程等待某些事件发生。他们通常支持这些行动

    1. 等待,阻止线程发出信号,
    2. 通知,它告诉一个线程在条件变量上等待它可以继续,
    3. Notify-all ,告诉所有等待条件变量的线程他们可以继续。
    4. 条件变量和信号量可以(通常)可以互换使用,并对锁用法的设计进行适当的更改。但是,有时信号量更容易使用,有时条件变量更容易使用,因此我们有两个原语可用。通常,由于您使用的特定库或语言,您将选择使用一个而不是另一个。例如,Java对象具有对监视器(与锁配对的条件变量)的内置支持,因此在Java中使用条件变量通常很有用,尽管Java信号量确实存在。如果您在Windows中进行编程,则信号量是首选的同步方法,但条件变量确实存在。

      希望这有帮助!

答案 1 :(得分:0)

自旋锁使用忙等待,因此名称spin-thread旋转无效。

  

它做的是"我可以进去吗?我可以进去吗?我可以进去......等等#34;直到锁允许它在临界区(CS)

信号量:通常使用信号/通知和队列实现,因此当线程踩到信号量时,如果临界区中有另一个线程,它将进入休眠状态并进入队列。如果CS中没有其他线程,则当前线程进入该线程。当另一个线程在CS中时,踩到信号量的所有其他线程进入队列。当第一个线程退出CS时,它再次踩到信号量。信号量现在占用队列中的第一个线程并唤醒它,这反过来使线程进入CS。

  

使用信号/等待实现信号量,线程说我可以进入吗?如果不是,它说我可以叫醒我。如果是的话,它会进入。

编辑:信号量与条件

条件上的等待和信号操作与计数信号量时的P和V操作非常相似。 wait语句可以阻止线程的执行,而signal语句可以导致另一个线程的恢复。但是,它们之间存在差异。 P操作不一定阻塞线程,因为信号量计数器可能大于零。但是,wait语句总是阻塞一个线程。 signal语句可以在一个条件上准备好(解除阻塞)一个被阻塞的线程,就像V操作在信号量上准备好一个被阻塞的线程一样。不同之处在于V操作总是递增信号量计数器;从而影响后续的P操作。空条件下的信号语句不会影响后续的等待语句,因此会丢失。另一个区别是,如果执行了足够的V操作,则在信号量上阻塞的多个线程可以无延迟地恢复执行。在互斥体类型的情况下,多个信号语句会解除阻塞多个线程,但由于互斥体类型的互斥属性,这些线程中只有一个能够执行。