【发布时间】:2012-03-18 13:20:16
【问题描述】:
pthread_cond_wait 是否将调用线程置于等待状态以被 pthread_cond_signal/pthread_cond_broadcast 唤醒,使其不会轮询和搅动 CPU?
另外,sem_wait 是否将线程置于等待状态?如果我理解正确,互斥锁获取/释放方法会使线程在互斥锁上连续轮询,并且不会将线程置于等待状态。
【问题讨论】:
pthread_cond_wait 是否将调用线程置于等待状态以被 pthread_cond_signal/pthread_cond_broadcast 唤醒,使其不会轮询和搅动 CPU?
另外,sem_wait 是否将线程置于等待状态?如果我理解正确,互斥锁获取/释放方法会使线程在互斥锁上连续轮询,并且不会将线程置于等待状态。
【问题讨论】:
是的,pthread_cond_wait,当成功时,会导致线程等待直到收到通知。这就是调用的目的。
sem_wait 将把线程置于等待状态如果信号量不能递减。在它处于高电平状态时,调用将立即返回。
在大多数情况下,您不必关心锁是通过忙等待还是调度程序让步来实现的。无论哪种方式,您都可以获得有保证的行为,并且通常库实现者会选择您正在运行的平台上可用的最有效的方法。在某些情况下(您有多个内核并且预期的等待时间很短),这是忙等待。
【讨论】:
是的,调用 pthread_cond_wait() 的任务将进入等待状态:
pthread_cond_wait atomically releases mutex and cause the
calling thread to block on the condition variable cond
在当前的linux内部,它使用futex来做这些事情。
sem_wait 将阻塞任务,直到有可能 如果信号量当前,则对信号量执行减量 调用时值为零。
【讨论】: