[关闭]
@nrailgun 2017-11-01T20:31:05.000000Z 字数 409 阅读 1086

Sleep, wakeup, and locks

程序设计


观察如下代码:

  1. def producer():
  2. set(cond)
  3. wakeup()
  4. def consumer():
  5. while not cond:
  6. sleep()

存在问题:如果在 while not cond:sleep() 之间执行了
wakeup(),那么会导致信号丢失,导致永久睡眠。

显然语句之间应该是不可分割的(Atomic),因此需要加锁保持原子性。
但是持锁睡眠将导致 producer 永久死锁,因此睡眠必须放弃锁。
POSIX 的线程条件接口可见一斑。

  1. int pthread_cond_wait(pthread_cond_t *cond, pthread_mutex_t *mutex);
  2. int pthread_cond_signal(pthread_cond_t *cond);

StackOverflow 有一个错误的高票回答,声称“不应持锁唤醒,
避免其他线程因无法获得锁而再次睡眠”。显然是错误的。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注