假设在信号线程修改影响谓词真值的状态并调用pthread_cond_signal
而不持有与条件变量关联的互斥锁的情况下使用条件变量?这种类型的使用是否总是受制于可能错过信号的竞争条件?
对我来说,似乎总是有一个明显的种族:
- 服务员将谓词评估为假,但在它可以开始等待之前......
- 另一个线程以使谓词为真的方式更改状态。
- 另一个线程调用
pthread_cond_signal
,它什么也不做,因为还没有服务员。 - 服务员线程进入
pthread_cond_wait
,不知道谓词现在为真,并无限期地等待。
但是,如果情况发生变化,是否总是存在相同类型的竞争条件,以便(A)在调用时保持互斥锁,而pthread_cond_signal
不是在更改状态时保持,或者(B)在更改状态时保持互斥锁,只是不是在打电话的时候pthread_cond_signal
?
我是从想知道上述非最佳实践用法是否有任何有效用途的角度来问的,即正确的条件变量实现是否需要在避免竞争条件本身时考虑这种用法,或者它是否可以忽略它们,因为它们本来就很活泼。