c - 信号量术语

标签 c pthreads semaphore condition-variable

通常所说的信号量...它们涉及忙等待吗?我对术语感到困惑。请告诉我我得出的结论中哪些是正确的。

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

最佳答案

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

  1. 向上,增加许可证数量,并且
  2. 向下,尝试减少许可证数量。如果没有足够的许可,则此操作将等到有足够的许可为止。

实现信号量的方法有很多种。但通常情况下,信号量不会被实现为自旋锁,并且实际上让操作系统阻塞线程并使其休眠,直到请求的许 cocoa 用为止。也就是说,信号量的完全合法的实现可以使其处于忙等待状态;我只是不知道有任何实现可以做到这一点。

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

  1. 等待,它会阻塞线程直到收到信号,
  2. 通知,告诉正在等待条件变量的一个线程它可以继续,并且
  3. Notify-all,告诉所有等待条件变量的线程它们可以继续。

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

希望这有帮助!

关于c - 信号量术语,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9155215/

相关文章:

c - 指向匿名 union 的指针转换在 C11 中有效吗?

C89(再次)计算 goto 如何

c - 在多线程环境中两个函数之间共享公共(public)变量

java - 信号量 - 为什么我的线程一个接一个地运行而不是并发运行?

java - 与信号量同步线程

c - Fortran 派生类型包含可从 C 访问的派生类型

c - 格式字符串周围的 `TEXT` 在 "printf"中是什么意思

c - ubuntu 14.04.1 x64 上 Codelite 6.1 中的 Pthreads

c - 除了 pthread_create 在 linux 上创建 linux 线程的方法

c - 信号量和同步中的段错误