pthread_cond_wait和互斥量要求

aaj*_*tak 17 posix pthreads

为什么在调用之前需要锁定互斥锁pthread_cond_wait

另外,在调用之前是否需要锁定(在同一个互斥锁上)pthread_cond_signal

谢谢你的帮助.

Nem*_*emo 26

为什么在调用pthread_cond_wait之前需要锁定互斥锁?

因为否则会有不可避免的竞争条件.

互斥锁可以保护共享状态.条件变量与状态上的某个谓词("条件")相关联.基本的想法是你想要:

1)检查谓词

2)如果谓词是假的,则进入睡眠状态直到它变为真

在并发系统中,某些线程总是可以在(1)和(2)之间使谓词成立.为了避免这种竞争,你必须在(1)之前持有互斥锁,并且必须在执行(2)时原子地释放它.

例如,对于队列,谓词可能是"队列不为空".但是在您检查队列是否为非空以及您进入休眠状态的时间之间,其他一些线程可能会向队列添加一些内容.

因此,您必须在检查谓词时以及在调用pthread_cond_wait时保持互斥锁.

另外,在调用pthread_cond_signal之前是否需要锁定(在同一个互斥锁上)?

据我所知,这没有根本问题; 它只是引入潜在的低效率.

在这里,您正在修改的任何共享状态(从而使谓词成立)必须受到互斥锁的保护.因此,无论何时您想要发出信号,您都必须已经拥有互斥锁.

如果在发出条件信号之前释放互斥锁,则由于某些其他线程的操作,谓词之间可能会变为假.这种竞争不会导致失败,因为等待条件的任何线程必须在继续之前检查谓词...但为什么要通过麻烦呢?

底线:只需按照说明操作,您甚至不必考虑这些问题.:-)