经典同步问题:哲学家 (线程) 有时思考,有时吃饭
失败的尝试
成功的尝试 (万能的方法)
#define CAN_EAT (avail[lhs] && avail[rhs])
mutex_lock(&mutex);
while (!CAN_EAT)
cond_wait(&cv, &mutex);
avail[lhs] = avail[rhs] = false;
mutex_unlock(&mutex);
mutex_lock(&mutex);
avail[lhs] = avail[rhs] = true;
cond_broadcast(&cv);
mutex_unlock(&mutex);
Trick: 死锁会在 5 个哲学家 “同时吃饭” 时发生
但这真的对吗?
“Leader/follower” - 有一个集中的 “总控”,而非 “各自协调”
void Tphilosopher(int id) {
send(Twaiter, id, EAT);
receive(Twatier); // 等待 waiter 把两把叉子递给哲学家
eat();
send(Twaiter, id, DONE); // 归还叉子
}
void Twaiter() {
while (1) {
(id, status) = receive(Any);
switch (status) { ... }
}
}
你可能会觉得,管叉子的人是性能瓶颈