c – 未锁定pthread_cond_timedwait和pthread_cond_signal的互斥锁(在Linux上)

调用pthread_cond_timedwait是否有任何缺点,而不首先锁定相关的互斥锁,并且在调用pthread_cond_signal时也不会使用互斥锁?

在我的情况下,确实没有条件要检查,我想要一个非常类似于Java wait(long)和notify()的行为.

根据文档,可能存在“不可预测的调度行为”.我不确定这意味着什么.

一个示例程序似乎工作正常,而不首先锁定互斥锁.

最佳答案
第一个不行:

The pthread_cond_timedwait() and
pthread_cond_wait() functions shall
block on a condition variable. They
shall be called with mutex locked by
the calling thread or undefined
behavior results.

http://opengroup.org/onlinepubs/009695399/functions/pthread_cond_timedwait.html

原因是实现可能希望依赖锁定的互斥锁,以便安全地将您添加到服务器列表中.它可能想要在没有先检查它的情况下释放互斥锁.

第二个是令人不安的:

if predictable scheduling behaviour is
required, then that mutex is locked by
the thread calling
pthread_cond_signal() or
pthread_cond_broadcast().

http://www.opengroup.org/onlinepubs/007908775/xsh/pthread_cond_signal.html

我不知道具体的竞争条件会影响调度程序的行为,如果你发出警告而不采取锁定的话.所以我不知道未定义的调度程序行为有多糟糕:例如,对于广播,服务员只是没有按优先级顺序获取锁(或者您的特定调度程序通常表现).或者也许服务员会“迷失”.

但是,通常情况下,使用条件变量,您需要设置条件(至少是标志)和信号,而不仅仅是信号,为此您需要使用互斥锁.原因是否则,如果你与另一个调用wait()的线程并发,那么你会根据wait()或signal()获胜而获得完全不同的行为:如果signal()先偷偷摸摸,那么你将会即使您关心的信号已经发生,也要等待完全超时.这很少是条件变量的用户想要的,但可能对你没问题.也许这就是文档所说的“不可预测的调度程序行为” – 突然间,时间片对于程序的行为变得至关重要.

顺便说一下,在Java中你必须拥有锁才能通知()或notifyAll():

This method should only be called by a
thread that is the owner of this
object’s monitor.

http://java.sun.com/j2se/1.4.2/docs/api/java/lang/Object.html#notify()

Java synchronized {/} / wait / notifty / notifyAll行为类似于pthread_mutex_lock / pthread_mutex_unlock / pthread_cond_wait / pthread_cond_signal / pthread_cond_broadcast,而不是巧合.

转载注明原文:c – 未锁定pthread_cond_timedwait和pthread_cond_signal的互斥锁(在Linux上) - 代码日志