首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >信号量术语

信号量术语
EN

Stack Overflow用户
提问于 2012-02-06 11:18:59
回答 2查看 500关注 0票数 2

通常所说的信号量...它们是否涉及忙碌的等待?我对这个术语感到困惑。请告诉我,在我能画出的结论中,哪些是正确的。

A)自旋锁涉及到忙碌的等待,所以为了避免这种情况,我们有信号量。

B)信号量是一种自旋锁,但我们可以在不忙于等待的情况下拥有信号量

c)pthread_condition变量和信号量做同样的事情?如果是这样,它们是否等同于semaphore.h库中的信号量。如果两者代表相同的功能,我会感到困惑。

EN

回答 2

Stack Overflow用户

发布于 2012-02-06 11:46:39

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

增加许可证数量的

  1. Up,,试图减少许可证数量的and
  2. Down,。如果可用许可不足,则此操作将等待,直到有足够的许可可用。

有许多方法可以实现信号量。不过,通常情况下,信号量并不是以自旋锁的形式实现的,而是让操作系统阻塞线程并让其休眠,直到请求的许可证可用。也就是说,信号量的一个完全合法的实现可能会让它很忙--等等;我只是不知道有什么实现可以做到这一点。

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

  1. Wait,,它阻塞线程,直到它被通知为止;
  2. Notify,,它告诉等待条件变量的一个线程它可以继续;and
  3. Notify-all,,它告诉所有等待条件变量的线程,它们可以继续。

条件变量和信号量可以(通常)互换使用,并对锁使用的设计进行适当的更改。然而,有时信号量更容易使用,而有时条件变量更容易使用,所以我们有两个可用的原语。通常,由于所使用的库或语言的不同,您会选择使用一种而不是另一种。例如,Java对象具有对监视器(条件变量和锁)的内置支持,因此在Java中使用条件变量通常很有用,尽管Java信号量确实存在。如果您在Windows中编程,那么信号量是首选的同步方法,尽管确实存在条件变量。

希望这能有所帮助!

票数 4
EN

Stack Overflow用户

发布于 2012-02-06 11:47:33

自旋锁使用忙碌等待,因此得名自旋线程不做任何事情。

它做的是“我能进去吗?我能进去吗?我能进去吗……等等”,直到锁允许它进入临界区(CS)

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

有一个用信号/等待实现的信号量,线程说我可以进去吗?如果不是,它会在我可以唤醒我的时候唤醒我。如果是,它就会进入。

编辑:信号量与条件

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9155215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档