打印 “合法” 的括号序列 (())()
#define CAN_PRODUCE (count < n)
#define CAN_CONSUME (count > 0)
wait_until(CAN_PRODUCE) with (mutex) {
count++;
printf("(");
}
wait_until(CAN_CONSUME) with (mutex) {
count--;
printf(")");
}
void P(sem_t *sem) { // wait
wait_until(sem->count > 0) {
sem->count--;
}
}
void V(sem_t *sem) { // post (signal)
atomic {
sem->count++;
}
}
正是因为条件的特殊性,信号量不需要 broadcast
初始时 count = 1 的特殊情况
#define YES 1
#define NO 0
void lock() {
wait_until(count == YES) {
count = NO;
}
}
void unlock() {
count = YES;
}
P - prolaag (try + decrease/down/wait/acquire)
V - verhoog (increase/up/post/signal/release)
扩展的互斥锁:一个手环 → $n$ 个手环
信号量设计的重点
void Tproduce() {
P(&empty);
printf("("); // 注意共享数据结构访问需互斥
V(&fill);
}
void Tconsume() {
P(&fill);
printf(")");
V(&empty);
}