通常所说的信号量...它们是否涉及忙碌的等待?我对这个术语感到困惑。请告诉我,在我能画出的结论中,哪些是正确的。
A)自旋锁涉及到忙碌的等待,所以为了避免这种情况,我们有信号量。
B)信号量是一种自旋锁,但我们可以在不忙于等待的情况下拥有信号量
c)pthread_condition变量和信号量做同样的事情?如果是这样,它们是否等同于semaphore.h库中的信号量。如果两者代表相同的功能,我会感到困惑。
发布于 2012-02-06 11:46:39
抽象地说,信号量是一个具有多个相关许可的锁。信号量支持两种操作:
增加许可证数量的
有许多方法可以实现信号量。不过,通常情况下,信号量并不是以自旋锁的形式实现的,而是让操作系统阻塞线程并让其休眠,直到请求的许可证可用。也就是说,信号量的一个完全合法的实现可能会让它很忙--等等;我只是不知道有什么实现可以做到这一点。
条件变量代表一个不同的概念。通常,信号量被设计用来管理只存在这么多副本的资源。每个需要该资源的线程都会等待,直到保护对该资源的访问的信号量可用,并且每个使用该资源的线程都拥有一个许可证。条件变量通常用于允许线程等待某些事件发生。它们通常支持操作
条件变量和信号量可以(通常)互换使用,并对锁使用的设计进行适当的更改。然而,有时信号量更容易使用,而有时条件变量更容易使用,所以我们有两个可用的原语。通常,由于所使用的库或语言的不同,您会选择使用一种而不是另一种。例如,Java对象具有对监视器(条件变量和锁)的内置支持,因此在Java中使用条件变量通常很有用,尽管Java信号量确实存在。如果您在Windows中编程,那么信号量是首选的同步方法,尽管确实存在条件变量。
希望这能有所帮助!
发布于 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语句确实解除了对多个线程的阻塞,但由于互斥类型的互斥属性,这些线程中只有一个能够执行。
https://stackoverflow.com/questions/9155215
复制相似问题