void produce(Object obj); Object consume();
void produce() { printf("("); } void consume() { printf(")"); }
printf
((())())(((
(((())))
(()))
void produce() { wait_until(括号深度 < n) { printf("("); } } void consume() { wait_until(括号深度 > 0) { printf(")"); } }
mutex_lock(&lk); if (!condition) { cond_wait(&cv, &lk); } // Wait for someone for wake-up. assert(condition); mutex_unlock(&lk);
cond_signal(&cv); // Wake up a (random) thread cond_broadcast(&cv); // Wake up all threads
mutex_lock(&mutex); while (!COND) { wait(&cv, &mutex); } assert(cond); ... mutex_unlock(&mutex);