通常所说的信号量...它们涉及忙等待吗?我对术语感到困惑。请告诉我我得出的结论中哪些是正确的。
a)自旋锁涉及忙等待,因此为了避免这种情况,我们有信号量。
b) 信号量是自旋锁的一种,但是我们可以拥有信号量而无需忙于等待
c)pthread_condition变量与信号量做同样的事情?如果是这样,它们是否相当于 semaphore.h 库中的信号量。如果两者代表相同的功能,我会很困惑。
最佳答案
抽象地说,信号量是一个带有许多与其关联的许可的锁。信号量支持两种操作:
- 向上,增加许可证数量,并且
- 向下,尝试减少许可证数量。如果没有足够的许可,则此操作将等到有足够的许可为止。
实现信号量的方法有很多种。但通常情况下,信号量不会被实现为自旋锁,并且实际上让操作系统阻塞线程并使其休眠,直到请求的许 cocoa 用为止。也就是说,信号量的完全合法的实现可以使其处于忙等待状态;我只是不知道有任何实现可以做到这一点。
条件变量代表不同的概念。通常,信号量旨在管理仅存在这么多副本的资源。每个需要该资源的线程都会等待,直到保护对该资源的访问的信号量变得可用,并且每个使用该资源的线程都拥有一个许可证。条件变量通常用于允许线程等待某些事件的发生。他们通常支持操作
- 等待,它会阻塞线程直到收到信号,
- 通知,告诉正在等待条件变量的一个线程它可以继续,并且
- Notify-all,告诉所有等待条件变量的线程它们可以继续。
条件变量和信号量(通常)可以互换使用,并对锁使用的设计进行适当的更改。但是,有时信号量更容易使用,有时条件变量更容易使用,因此我们可以使用这两种原语。通常,由于您使用的特定库或语言,您会选择使用其中一种。例如,Java 对象具有对监视器(与锁配对的条件变量)的内置支持,因此在 Java 中使用条件变量通常很有用,尽管 Java 信号量确实存在。如果您在 Windows 中编程,那么信号量是首选的同步方法,尽管条件变量确实存在。
希望这有帮助!
关于c - 信号量术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155215/