一、问
题
快递公司问题件快递公司问题件货款处理关于圆的周长面积重点题型关于解方程组的题及答案关于南海问题
描述:
有五个哲学家围坐在一圆桌旁,桌中央有一盘通心粉,每人面前有一只空盘子,每两人
之间放一只筷子每个哲学家的行为是思考,感到饥饿,然后吃通心粉.为了吃通心粉,每
个哲学家必须拿到两只筷子,并且每个人只能直接从自己的左边或右边去取筷子
二、防止死锁发生的分配方式:
仅当一个哲学家左右两边的筷子都可用时,才允许他拿筷子。这样要么一次占有两只筷子(所有线程需要的资源)进行下一步的吃通心粉,然后释放所有的资源;要么不占用资源,这样就不可能产生死锁了。
三、产生死锁的分配方式:
当筷子(资源)可用时,先分配左边的筷子,等待一会后再分配右边的筷子,由于这个过程中,左边的筷子一直没有释放,就有可能产生死锁了。
四、程序运行说明
程序运行过程中会弹出一个MessageBox提示操作者操作:
1.第一个对话框用于选择运行模式
a.选择yes 表示采用的是运行的防止死锁的方式,这样的话整个程序可以一直运行下去,不会产生死锁。
b.选择no 表示运行产生死锁的方式会弹出第二个对话框。
2.第二个对话框用于选择运行时,线程运行的时间
a. 选择 res 线程时间比较短,很快就可以死锁
b.选择no 线程时间跟选择yes 时候的时间差不多,产生死锁的时间稍微长一点
五、关于哲学家就餐问题的程序代码分析:
A. Dining.c
变量说明:
HINSTANCE
hInst
应用实例句柄
HWND hWndMain
主窗口句柄
HBITMAP
hbmpOffscreen
位图句柄
BOOL bWaitMultiple
用于选择等待的方式(要么死锁,要么一直循环运行)
BOOL bFastFood;
用于选择进程等待的时间
extern int gDinerState[]
用于表示哲学家的状态(外部接口)
extern int gChopstickState[]
用于表示筷子的状态
extern HANDLE gchopStick[PHILOSOPHERS]
筷子的数组
函数说明:
LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
处理消息函数:
根据进程调度的消息的不同处理不同的消息包括:关闭窗口,销毁资源,画窗口,和重画窗口等
BOOL CreateOffscreen()
获得当前窗口的一个位图句柄
void RenderOffscreen(HDC hDestDC)
通过位图句柄画演示的界面
1.先画桌子,再画筷子,再画盘子,
2.再画哲学家:
哲学家用圆表示,根据哲学家的状态选择画笔(为resting 状态时为绿色圆圈,为等待或者,就餐时为红色圆圈)
3.最后画哲学家的手:
判断的依据是若筷子的编号和哲学家的编号一致,那么认为这根筷子属于这个哲学家(筷子资源空闲)那么可以画手表示哲学家获得了这个筷子。(获得资源)
BOOL InitApplication(HINSTANCE hInstance)
初始化应用窗口
BOOL InitInstance(HINSTANCE hInstance, int nCmdShow)
初始化主窗口
弹出选择对话框进行模式选择,并启动进程
int PASCAL WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance,
LPSTR lpCmdLine, int nCmdShow)
调用前面的函数并对进线程消息进行处理
B.Mutex.c
变量说明:
extern HWND hWndMain
在Dining.c中定义是这个文件的外部接口
extern BOOL bWaitMultiple
在Dining.c中定义是这个文件的外部接口
extern BOOL bFastFood
在Dining.c中定义是这个文件的外部接口
int gDinerState[PHILOSOPHERS]
哲学家状态数组
int gChopstickState[PHILOSOPHERS]
筷子状态数组
HANDLE gchopStick[PHILOSOPHERS]
筷子状态数组
函数说明:
1. DWORD WINAPI PhilosopherThread(LPVOID pVoid)
哲学家进程:
用于分配给哲学家筷子(资源)通过开始运行时候的对话框的选择来控制资源的分配方式:两中分配方式见二、三所述。通过随机产生的时间来控制线程的运行,
每个哲学家的状态都是resting waiting eating,一直循环。
2.int Diner(void)
用于建立互斥的信号对象(筷子)和启动哲学家进程