0

如果一个线程调用 pthread_cond_wait(cond_ptr,mutex_ptr) 将是一个的cond_ptr,它是否保证不会睡着?

根据http://pubs.opengroup.org/onlinepubs/007908799/xsh/pthread_cond_wait.html,空 cond_ptr 只是意味着 pthread_cond_wait() 可能(不是强调)失败,所以我猜线程可以在空条件下睡着变量?

4

1 回答 1

3

我看不到一个有效的用例,我想知道为什么它会很重要。您不应该使用无效的条件变量进行调用。pthread_cond_wait

如果您对此感到担心,只需将您的代码更改为:

pthread_cond_wait (pcv, pmutex);

类似于:

if (pcv != NULL) pthread_cond_wait (pcv, pmutex);

并且不会用 NULL 调用它。

我怀疑它被放入“可能”只是因为有一个 pthreads 的实现(甚至可能是原始的 DEC 线程本身)在这种情况下没有返回失败代码。

但是,由于几乎可以肯定,另一种选择是整个事情都陷入了尖叫之中,所以我不会依赖它:-)


如果您担心该代码的原子性,则不必担心。只需使用保护条件变量的相同互斥锁来保护列表中保存的 CV 指针:

claim mutex A
somenode->cv = NULL
release mutex A

并且,在您的循环代码中:

claim mutex A
if loopnode->cv != null:
    wait on condvar loopnode->cv using mutex A
// mutex A is locked again
: : :

if在调用和调用期间互斥锁被锁定的事实pthread_condvar_wait意味着不存在竞争条件。pthread_condvar_wait在循环线程释放调用中的互斥锁之前,没有任何东西可以更改节点条件变量。到那时,调用正在使用它自己的本地指针副本,因此更改列表中的一个将无效。

而且,如果更改节点的代码获取了互斥锁,则ifandpthread_condvar_wait将无法执行,直到该互斥锁被释放。

于 2011-03-02T11:22:47.423 回答