用信号量实现条件变量 
Implementing condition variables out of a simple primitive like semaphores is surprisingly tricky. (from a 2003 report)
void wait(cond_t *cv, mutex_t *mutex) {
atomic_inc(&cv->nwait);
mutex_unlock(mutex);
P(&cv->sleep);
mutex_lock(mutex);
}
void broadcast(cond_t *cv) {
mutex_lock(&cv->lock);
for (int i = 0; i < cv->nwait; i++)
V(&cv->sleep);
cv->nwait = 0;
mutex_unlock(&cv->lock);
}
- 唤醒丢失: 一个 “早就 wait 但没有 P” 的线程会抢走唤醒