线程同步由
条件不成立等待 和同步条件达成继续 构成
线程 join
nexit == T
nexit++
生产者/消费者问题
CAN_PRODUCE (count < n)
count--
CAN_CONSUME (count > 0)
count++
wait_until(CAN_PRODUCE) {
count++;
printf("(");
}
wait_until(CAN_CONSUME) {
count--;
printf(")");
}
若干实现上的难题
一把互斥锁 + 一个 “条件变量” + 手工唤醒
void Tproduce() {
mutex_lock(&lk);
if (!CAN_PRODUCE) cond_wait(&cv, &lk);
printf("("); count++; cond_signal(&cv);
mutex_unlock(&lk);
}
void Tconsume() {
mutex_lock(&lk);
if (!CAN_CONSUME) cond_wait(&cv, &lk);
printf(")"); count--; cond_signal(&cv);
mutex_unlock(&lk);
}
代码演示 & 压力测试 & 模型检验
同步的本质:wait_until(COND) { ... }
,因此:
mutex_lock(&mutex);
while (!COND) {
wait(&cv, &mutex);
}
assert(cond); // 互斥锁保证条件成立
mutex_unlock(&mutex);
mutex_lock(&mutex);
// 任何可能使条件满足的代码
broadcast(&cv);
mutex_unlock(&mutex);