#include "staticLib1.h"
#pragma comment(lib, "StaticLib1.lib")
using namespace std;
// 状态显示函数
void xianshi(int i) {
EnterCriticalSection(&cs);
cout << "线程" << i << "被调用" << ":" << " ";
LeaveCriticalSection(&cs);
return;
}
void thinking(int i) {
EnterCriticalSection(&cs);
xianshi(i);
cout << "哲学家" << i << "在思考" << endl;
Sleep(sleep_time);
LeaveCriticalSection(&cs);
return;
}
void hungry(int i) {
EnterCriticalSection(&cs);
xianshi(i);
cout << "哲学家" << i << "饥饿了" << endl;
Sleep(sleep_time);
LeaveCriticalSection(&cs);
return;
}
void pickup(int i, int j) {
EnterCriticalSection(&cs);
xianshi(i);
if (j == i) {
cout << "哲学家" << i << "拿起左手边的筷子:-" << j << endl;
}
else if (i == number - 1) {
cout << "哲学家" << i << "拿起右手边的筷子:-" << 0 << endl;
}
else {
cout << "哲学家" << i << "拿起右手边的筷子:-" << j << endl;
}
Sleep(sleep_time);
LeaveCriticalSection(&cs);
return;
}
void eating(int i) {
EnterCriticalSection(&cs);
xianshi(i);
cout << "哲学家" << i << "正在吃饭" << endl;
Sleep(eating_time);
LeaveCriticalSection(&cs);
return;
}
void putdown(int i, int j) {
EnterCriticalSection(&cs);
xianshi(i);
if (j == i) {
cout << "哲学家" << i << "放下左手边的筷子:+" << j << endl;
}
else if (i == number - 1) {
cout << "哲学家" << i << "放下右手边的筷子:+" << 0 << endl;
}
else {
cout << "哲学家" << i << "放下右手边的筷子:+" << j << endl;
}
Sleep(sleep_time);
LeaveCriticalSection(&cs);
return;
}
// 线程定义
UINT WINAPI ThreadFunc1(void* i) {
intptr_t num = reinterpret_cast<intptr_t>(i);
while (1) {
thinking(num);
hungry(num);
EnterCriticalSection(&chopsticks[num]); // 拿起左手边的筷子
pickup(num, num);
EnterCriticalSection(&chopsticks[(num + 1) % 5]); // 拿起右手边的筷子
pickup(num, num + 1);
eating(num);
LeaveCriticalSection(&chopsticks[num]); // 放下左边的筷子
putdown(num, num);
LeaveCriticalSection(&chopsticks[(num + 1) % 5]); // 放下右边的筷子
putdown(num, num + 1);
}
return 1;
}
UINT WINAPI ThreadFunc2(void* i) {
intptr_t num = reinterpret_cast<intptr_t>(i);
while (1) {
thinking(num);
hungry(num);
EnterCriticalSection(&chopsticks[0]); // 拿起右手边的筷子
pickup(num, 0);
EnterCriticalSection(&chopsticks[num - 1]); // 拿起左手边的筷子
pickup(num, num);
eating(num);
LeaveCriticalSection(&chopsticks[0]); // 放下左边的筷子
putdown(num, 0);
LeaveCriticalSection(&chopsticks[num - 1]); // 放下右边的筷子
putdown(num, num);
}
return 1;
}
int main() {
HANDLE hThread[number];
InitializeCriticalSection(&cs);
//循环建立线程0-3
int i;
for (i = 0; i < number - 1; i++) {
InitializeCriticalSection(&chopsticks[i]);
hThread[i] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc1, reinterpret_cast<void*>(i), 0, NULL);
}
InitializeCriticalSection(&chopsticks[number - 1]);
//让其不出现死锁的定义,最后一个哲学家先拿右边筷子,再拿左边筷子
hThread[number - 1] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc2, reinterpret_cast<void*>(number - 1), 0, NULL);
//出现死锁的定义,最后一个哲学家和其他哲学家一样,也是先拿左边筷子,再拿右边筷子
//hThread[number - 1] = (HANDLE)_beginthreadex(NULL, 0, ThreadFunc1, reinterpret_cast<void*>(number - 1), 0, NULL);
//等所有线程执行完
WaitForMultipleObjects(number, hThread, true, INFINITE);
for (i = 0; i < number; i++) {
LeaveCriticalSection(&chopsticks[i]);
CloseHandle(hThread[i]);
}
LeaveCriticalSection(&cs);
return 0;
}
没有合适的资源?快使用搜索试试~ 我知道了~
温馨提示
5. 多线程编程:哲学家问题。(1 人,难度: 1) 设置线程,描述哲学家 ; 使用菜单随机启动哲学家 ; 在窗口上显示线程执行状态; 随着线程的执行,更新窗口的显示; 编写正确的哲学家程序,设法延迟线程的执行,使之出现死锁; 编写正确的哲学家程序,保证不出现死锁; 每个完成的课程设计包含两个代码组成部分: (1) 操作系统代码; (2) 演示代码; 1.1.1 操作系统代码 操作系统代码部分,完成课程设计的主体设计内容,需要根据操作系统内核原理来进行 数据结构的设计和算法的设计与实现。 这一部分设计内容以一系列函数的形式表现出来,设计的最终结果,就是一系列的.C 文件,其中定义和实现所有完成设计题目功能的代码。一般将这部分的设计组织成一个 Project, Project的目标不是生成应用程序,而是生成一个.lib。 这部分设计强调按照操作系统原理课程的要求,设计和实现相关的数据结构。数据结构 需要精心设计,要求紧凑、节省空间。算法的设计也以操作系统原理课程讲授的标准算法为 基准。 允许并鼓励同学们设计自己的创新的数据结构和算法,但前提是需要给出实验数据和理
资源推荐
资源详情
资源评论
收起资源包目录
操作系统验收.rar (58个子文件)
操作系统验收
Project1
.vs
Project1
v17
Browse.VC.db 37.13MB
.suo 31KB
ipch
AutoPCH
6c24ce342fc1358f
DINING_PHILOSOPHERS.ipch 83.63MB
FileContentIndex
32656cc7-d861-497d-af90-4be2049757df.vsidx 8KB
8ded4765-a4ec-4f63-a6c3-57015486d3cb.vsidx 6KB
x64
Debug
Project1.pdb 1.54MB
Project1.exe 71KB
Project1
dining_philosophers.cpp 4KB
x64
Debug
vc143.pdb 468KB
Project1.tlog
CL.write.1.tlog 576B
Cl.items.tlog 175B
CL.command.1.tlog 802B
link.command.1.tlog 1KB
link.read.1.tlog 4KB
link.write.1.tlog 550B
Project1.lastbuildstate 178B
CL.read.1.tlog 41KB
Project1.exe.recipe 314B
Project1.ilk 815KB
dining_philosophers.obj 131KB
vc143.idb 363KB
Project1.log 4KB
Project1.vcxproj 7KB
Project1.vcxproj.user 168B
Project1.vcxproj.filters 981B
Project1.sln 1KB
StaticLib1
.vs
StaticLib1
v17
Browse.VC.db 37.2MB
.suo 32KB
ipch
f032fa119438c23.ipch 896KB
AutoPCH
93801e98157a28ec
STATICLIB1.ipch 83.38MB
fed30d5b4b33d2e5
STATICLIB1.ipch 896KB
FileContentIndex
77bc71ce-c929-49aa-9f30-210b6682a9e8.vsidx 3KB
f23ef992-8f7d-420f-bb86-70fbcb0bfc5d.vsidx 10KB
x64
Debug
StaticLib1.lib 7KB
StaticLib1.idb 27KB
StaticLib1.pdb 76KB
StaticLib1.sln 1KB
StaticLib1
StaticLib1.vcxproj.user 168B
framework.h 115B
StaticLib1.vcxproj.filters 1KB
StaticLib1.vcxproj 8KB
pch.h 544B
x64
Debug
StaticLib1.log 133B
StaticLib1.obj 3KB
StaticLib1.pch 3.69MB
StaticLib1.tlog
CL.write.1.tlog 1KB
Cl.items.tlog 316B
Lib.command.1.tlog 566B
StaticLib1.lastbuildstate 180B
CL.command.1.tlog 2KB
Lib-link.read.1.tlog 744B
Lib-link.write.1.tlog 422B
CL.read.1.tlog 1KB
pch.obj 3KB
StaticLib1.lib.recipe 152B
StaticLib1.cpp 167B
staticLib1.h 576B
pch.cpp 158B
共 58 条
- 1
资源评论
m0_65995006
- 粉丝: 0
- 资源: 6
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功