@nrailgun
2017-11-01T20:31:05.000000Z
字数 409
阅读 1086
程序设计
观察如下代码:
def producer():
set(cond)
wakeup()
def consumer():
while not cond:
sleep()
存在问题:如果在 while not cond:
与 sleep()
之间执行了
wakeup()
,那么会导致信号丢失,导致永久睡眠。
显然语句之间应该是不可分割的(Atomic),因此需要加锁保持原子性。
但是持锁睡眠将导致 producer
永久死锁,因此睡眠必须放弃锁。
POSIX 的线程条件接口可见一斑。
int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
int pthread_cond_signal(pthread_cond_t *cond);
StackOverflow 有一个错误的高票回答,声称“不应持锁唤醒,
避免其他线程因无法获得锁而再次睡眠”。显然是错误的。