求助:进程同步、互斥问题!!(解决不死锁的哲学家问题!)

cjm2252 2007-12-08 01:09:48
进程同步、互斥

实验目的
了解进程与程序的区别,加深对进程概念的理解。
掌握进程并发执行的原理,及其所引起的同步、互斥问题的方法
实验内容
自己编写P、V操作和信号量的模拟程序,然后用它们解决不死锁的哲学家问题,并把哲学家们的活动过程用文字或可视化表示出来。
(提示:首先设置一个“PCB”数组或队列,其中一个字段表示“阻塞原因兼阻塞标志”,本实验中,该数组有5个元素表示5个哲学家即可。它们“定时”提出申请以及进行“思考”“吃”的行为。再设一个“筷子”数组。还需要设置哪些数据结构以及需要哪些字段自己考虑。示例图如下,但不要求做得那么美观,尤其是在TC中)

用C语言编写!!请教各位C高手,麻烦帮帮忙,指导下!万分感谢!!
...全文
653 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
lindahuang2222 2010-12-21
  • 打赏
  • 举报
回复
额。。。。。。
bobo364 2010-12-21
  • 打赏
  • 举报
回复
先看看这个,兴许有用
/*************************************************************
* 文件名:Producer_Consumer.cpp
* 创建日期:.10.5
* 作 者:匿名
* 使用者:软件工程级,操作系统实验用
* 功 能:用P-V操作解决生产者-消费者问题(windows版本)
* 描 述:) 1个生产者,个消费者
* 2) 缓冲区大小:
* 3) 互斥对象:csArray
* 信号量:hFull
* 信号量:hEmpty
*
*
**************************************************************/
#include "stdafx.h"
#include "stdio.h"
#include <windows.h>
#define FILE_LOG
#ifdef FILE_LOG
FILE * cfileLog;
#endif

//缓冲区,大小为
int array[5];
//记录生成数据的个数
int pointer;
//记录取得的数据的位置
int pointerget;
//用来保存数据和
int sum;
//临界区对象
CRITICAL_SECTION csArray;
//句柄,保存Full信号量
HANDLE hFull;
//句柄,保存Empty信号量
HANDLE hEmpty;

//生产者函数
DWORD WINAPI Producer(LPVOID lpParam)
{
int i = 0;
pointer = 0;
while( i < 100 )
{
WaitForSingleObject(hEmpty,INFINITE);
EnterCriticalSection( &csArray);
array[(pointer++)%5] = i + 1;
printf("new data: %5d\n",i + 1);
#ifdef FILE_LOG
char DebugString[100];
int StringLong;
sprintf(DebugString,"new data: %5d\n",i + 1);
StringLong = strlen(DebugString);
fwrite(DebugString,1,StringLong,cfileLog);
#endif
LeaveCriticalSection( &csArray);
ReleaseSemaphore(hFull,1,NULL);
i++;
}
return 0;
}

//消费者函数A
DWORD WINAPI ConsumerA(LPVOID lpParam)
{
while(1)
{
WaitForSingleObject(hFull,INFINITE);
EnterCriticalSection( &csArray);
sum += array[(pointerget ++ )%5];
printf(" Consumer A get %5d\n",array[(pointerget -1)%5]);
if(pointerget == 100)
{
printf("The sum is %d",sum);
}
#ifdef FILE_LOG
char DebugString[100];
int StringLong;
sprintf(DebugString,"Consumer A get %5d\n",array[(pointerget -1)%5]);
StringLong = strlen(DebugString);
fwrite(DebugString,1,StringLong,cfileLog);
#endif
LeaveCriticalSection( &csArray);
ReleaseSemaphore(hEmpty,1,NULL);
}
return 0;
}

//消费者函数B
DWORD WINAPI ConsumerB(LPVOID lpParam)
{
while(1)
{
WaitForSingleObject(hFull,INFINITE);
EnterCriticalSection( &csArray);
sum += array[(pointerget ++ )%5];
printf("Consumer B get %5d \n",array[(pointerget -1 )%5]);
if(pointerget == 100)
{
printf("The sum is %d",sum);
}
#ifdef FILE_LOG
char DebugString[100];
int StringLong;
sprintf(DebugString,"Consumer B get %5d \n",array[(pointerget -1 )%5]);
StringLong = strlen(DebugString);
fwrite(DebugString,1,StringLong,cfileLog);
#endif
LeaveCriticalSection( &csArray);
ReleaseSemaphore(hEmpty,1,NULL);
}
return 0;
}



int main(int argc, char* argv[])
{
HANDLE hThreadProducer,hThreadConsumerA,hThreadComsumerB;
sum = 0;
pointerget = 0;
#ifdef FILE_LOG
cfileLog = fopen("生产者_消费者日志.txt","w");
#endif
InitializeCriticalSection( &csArray);
hFull = CreateSemaphore(NULL, 0, 5, NULL);
hEmpty = CreateSemaphore(NULL, 5, 5, NULL);
hThreadProducer = CreateThread(NULL, 0, Producer, NULL, 0, NULL);
hThreadConsumerA = CreateThread(NULL, 0, ConsumerA, NULL, 0, NULL);
hThreadComsumerB = CreateThread(NULL, 0, ConsumerB, NULL, 0, NULL);
getchar();
fclose(cfileLog);
return 0;
}
hdusunny44 2010-12-21
  • 打赏
  • 举报
回复

[Quote=引用 2 楼 weinjones 的回复:]

第一个哲学家说:
那位兄弟给双筷子我?
第二个递个给他一个叉子。
第一个就吃了起来:
第二个又说:
那位兄弟还要叉子?
第三个哲学家说:
我!
第二个就告诉第一个说:
你把叉子给第三个兄弟:
第一个说:
我还要用!
第二个无奈,只好出了一个勺子递给第三个:
凑合吧?
第三个也吃了起来;
第四个哲学家对第二个说:
你还有吗?
第二个说:
我自己也没有用的了!
……
[/Quote]
mzxniasf 2010-12-21
  • 打赏
  • 举报
回复
看到楼主的结帖率,表示很给力。
WeinJones 2007-12-08
  • 打赏
  • 举报
回复
第一个哲学家说:
那位兄弟给双筷子我?
第二个递个给他一个叉子。
第一个就吃了起来:
第二个又说:
那位兄弟还要叉子?
第三个哲学家说:
我!
第二个就告诉第一个说:
你把叉子给第三个兄弟:
第一个说:
我还要用!
第二个无奈,只好出了一个勺子递给第三个:
凑合吧?
第三个也吃了起来;
第四个哲学家对第二个说:
你还有吗?
第二个说:
我自己也没有用的了!
第四个又对第一个说:
你用完了没有?
第一个说:
快了!
第四个又对第三个说:
你用完了没?
第三个说:
还早呢!
第五个哲学家说:
我这里有,你拿去用吧!
第五个把筷子递给了第四个;
第四个问第五个:
那你用什么吃呢?
第五个说:
我用手就可以了。
第四个不好意思的说:
那还是你先用吧!
第五个说,不客气,我不用筷子。
第四个问:
为什么?
第五个说:
我吃麦当劳汉堡,用筷子干什么?
第四个:
.........
独孤过儿 2007-12-08
  • 打赏
  • 举报
回复
去google一下 哲学家就餐问题 ,有无数的答案
 本课程的主题是: 透析Linux系统编程    不同于市面上的课程,只会把核心主题放到函数的讲解,本课程的核心主题是 Linux系统编程的经验总结 ;    当你在系统编程中,调用一个系统调用来解决问题时,是否考虑过 该系统调用是否会对系统性能带来影响?是否还有最优的方式?    当你在系统编程过程中,遇到问题,是否只是检查代码逻辑,而不会去深入底层去查找问题 ?    本课程将一一解决系统编程带给你的难点,疑点?    比如控制文件IO章节,给出系统文件操作的默认行为,应用中如何修改这些行为,给出文件IO操作的最优方式;   比如系统调用,给出系统调用原理;系统调用的正确使用方式等   比如进程实现,结合底层,对比线程,深入理解两者;给出进程使用经验总结;   比如线程同步,不仅引出互斥锁 条件变量 自旋锁 读写锁使用方式,同时给出各个机制的应用场景 ;   比如 进程间通信,引出各个进程间通信的机制原理,给出各个进程间通信的应用场景;   比如 信号,给出信号在进程中信号处理处理函数的正确使用方式,给出在多线程中信号处理的正确方式;   比如 共享库,给出共享库的实现机制,给出共享库的正确使用方式;   同时 会讲解 系统安全问题 ; 可执行程序的静态布局和动态布局 ;灵活使用内存映射和虚拟内存;系统事件跟踪;   给出程序性能的调优思路;    丰富的项目实例讲解 ,提供宝贵的商业项目开发经验 ; 

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧