本课程设计探讨了经典计算机科学问题——“哲学家就餐问题”,通过模拟解决资源分配与死锁避免的策略,加深学生对操作系统同步机制的理解。
在程序设计过程中,首先给哲学家用到的5根筷子赋予布尔型标记:true表示筷子未被使用,false表示筷子已被占用,并将这些状态存储于数组kuaizi[5]中。整个程序定义了一个名为man的类,在该类中有两个私有成员变量status和number。其中,status用来标识当前哲学家的状态(0代表饥饿等待、1代表正手握两根筷子用餐、2表示正在思考)。初始状态下假设所有五个哲学家都在思考状态,并且从思考直接进入饥饿状态。
在分析每个哲学家的具体情况时,如果他们处于饥饿状态,则需要根据资源分配原则避免死锁的发生。为此,在类中引入lefthand和righthand标记分别代表左右两边筷子的状态(true表示未使用、false表示已占用)。
接下来定义了构造函数man(),其中设定所有哲学家用餐前都从一边开始寻找筷子:如果左筷可用而右筷已被其他哲学家占有,则该哲学家处于思考状态,并初始化资源分配。类中还包含了一个名为change的成员函数,用于判断每一轮每位哲学家的就餐情况及相应的资源状态变化。
为了避免死锁的发生,在程序运行过程中需要引入临界区的概念并使用EnterCriticalSection进行控制。解决方案的核心在于:首先设定编号为1和5(作为左右筷子)的状态均为未被占用;这样第一个哲学家就能开始用餐,之后其状态变为思考,并且这两根筷子变更为已使用。
接下来的每一轮分析中,需要排除上一轮已经使用的两支筷子,在剩余三支筷子中选择合适的哲学家进行用餐。为了保证不发生死锁现象,每次选取时必须确保左右两边的筷子都是未被占用的状态;同时需确认该哲学家处于饥饿状态才能进入就餐阶段,并在完成进餐后将其状态设为思考。
此外,程序引入了随机数生成函数srand(time(NULL)*1000),用于以千分之一秒作为种子来决定哪位哲学家用餐。此方法确保每次运行时选择的用餐者具有一定的不确定性与公平性。