关键问题:
能为每一个哲学家写一段描述其行为的程序,且决不会死锁吗?
提示:
如果五位哲学家同时拿起左面的叉子,就没有人能够拿到他们各自右面的叉子,于是发生了死锁。
如果每位哲学家在拿到左面的叉子后,发现其右面的叉子不可用,那么就先放下左面的叉的,等待一段时间,再重复此过程。
可能在某一个瞬间,所有的哲学家都同时拿起左叉,看到右叉不可用,又都放下左叉,等一会儿,又都同时拿起左叉,如此重复下去。虽然程序在不停运行,都无法取得进展,于是发生了活锁。
思路:
解决问题的关键在于,必须保证任意一位哲学家只有在其左右两个邻居都没有在进餐时,才允许其进入进餐状态。
这样做不仅不会发生死锁,而且对于任意数量的哲学家都能获得最大限度的并行性。
#include <stdio.h>
#include <stdlib.h>
#include <stdbool.h>
#include <errno.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#define DINNERS 5
const char* dinners[DINNERS] = {
"马超",
"赵云",
"关羽",
"张飞",
"黄忠"
};
enum Stat{
THINKING =