- 1、本文档共3页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
哲学家就餐问题1
/*inux进程的实现:哲学家就餐问题在 linux 上的程序实现
设有5个哲学家,共享一张放油把椅子的桌子,每人分得一吧椅子.但是桌子上总共只有5支筷子,在每个人两边分开各放一支.哲学家只有在肚子饥饿时才试图分两次从两边拾起筷子就餐.
就餐条件是:
1)哲学家想吃饭时,先提出吃饭的要求;
2)提出吃饭要求,并拿到2支筷子后,方可吃饭;
3)如果筷子已被他人获得,则必须等待该人吃完饭之后才能获取该筷子;
4)任一哲学家在自己未拿到2支筷子吃饭之前,决不放下手中的筷子;
5)刚开始就餐时,只允许2个哲学家请求吃饭.
试问:
1)描述一个保证不会出现两个邻座同时要求吃饭的算法;
2)描述一个既没有两邻座同时吃饭,又没有人饿死的算法;
3)在什么情况下,5个哲学家全都吃不上饭?
哲学家进餐问题是典型的同步问题.它是由Dijkstra提出并解决的.该问题是描述有五个哲学家,他们的生活方式是交替地进行思考和进餐.哲学家们共用一张圆桌,分别坐在周围的五张椅子上.在圆桌上有五个碗和五支筷子,平时一个哲学家进行思考,饥饿时便试图取用其左右岁靠近他的筷子,只有在他拿到两支筷子时才能进餐.进餐完毕,放下筷子继续思考.
*/
#include iostream
#include string.h
#include stdlib.h
#include pthread.h
#include unistd.h
#include semaphore.h
//#include RasUtil.h
using namespace std;
const unsigned int PHILOSOPHER_NUM=5;
const char THINKING=1;
const char HUNGRY=2;
const char DINING=3;
sem_t semph[PHILOSOPHER_NUM]; // each fork has a semaphore
pthread_mutex_t mutex; // Mutex for printing
void* philosopherProc(void* param);
int main(int argc, char* argv[])
{
int i;
srand(getpid());
pthread_t philosopherThread[PHILOSOPHER_NUM]; //定义线程数组
int phId[PHILOSOPHER_NUM];
pthread_mutex_init(mutex, NULL);
for (i=0; iPHILOSOPHER_NUM; i++)
{
phId[i] = i;
sem_init(semph[i], 0, 1); //对每只筷子信号量进行初始化为当前进程的局部信号量
pthread_create(philosopherThread[i], NULL, philosopherProc, (void*)(phId[i])); //以philosopherProc为原型创建PHILOSOPHER_NUM个线程
usleep(5000);
}
sleep(30);
return 0;
}
void* philosopherProc(void* param)
{
int myid;
char stateStr[128];
char mystate;
int ret;
unsigned int leftFork;
unsigned int rightFork;
myid = *((int*)(param));
cout philosopher myid begin...... endl;
usleep(1000000); //把进程挂起一段时间, 单位是微秒(百万分之一秒);
// initial state is THINKING
mystate = THINKING;
leftFork = (myid) % PHILOSOPHER_NUM;
rightFork = (myid + 1) % PHILOSOPHER_NUM;
while (true)
{
switch(mystate)
{
case THINKING:
// changing my state
mystate = HUNGRY;
strcpy(stateStr, HUNGRY);
break;
case H
您可能关注的文档
- 社区里的_百事通_.doc
- 无锡地铁2号线工程桩基检测服务项目招标公告.doc
- 机场8线等4条公交线路需延期开行情况一览表.doc
- 湖北兆信新材料科技有限公司20万吨_年全降解塑料.doc
- 温州市职业中等专业学校地方实验教材.ppt
- 湘版实验教材七年级第一.ppt.ppt
- 攀枝花电大工会2009年秋季学期工作总结.doc
- 武汉广喆数控机械制造有限公司.doc
- 浙江省化妆品生产企业卫生许可复核申办须知.doc
- 燃煤锅炉低氮燃烧技术的应用.doc
- 2023年江苏省镇江市润州区中考生物二模试卷+答案解析.pdf
- 2023年江苏省徐州市邳州市运河中学中考生物二模试卷+答案解析.pdf
- 2023年江苏省苏州市吴中区中考冲刺数学模拟预测卷+答案解析.pdf
- 2023年江苏省南通市崇川区田家炳中学中考数学四模试卷+答案解析.pdf
- 2023年江西省吉安市中考物理模拟试卷(一)+答案解析.pdf
- 2023年江苏省泰州市海陵区九年级(下)中考三模数学试卷+答案解析.pdf
- 2023年江苏省苏州市高新二中中考数学二模试卷+答案解析.pdf
- 2023年江苏省南通市九年级数学中考复习模拟卷+答案解析.pdf
- 2023年江苏省南通市海安市九年级数学模拟卷+答案解析.pdf
- 2023年江苏省泰州市靖江外国语学校中考数学一调试卷+答案解析.pdf
文档评论(0)