- 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
 - 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
 - 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
 - 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
 - 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
 - 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
 - 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
 
                        查看更多
                        
                    
                操作系统实验一文档
                    编号: ___________
版本: _____1.0___
生产者消费者问题及死锁问题的解决
       --基于Windows实验环境
编写??签名?
复查??签名?批准??签名?
程序代码说明
主要实现代码(基于VC++ 6.0): 
1.生产者进程
void Produce(void *p)//生产者进程
{
	DWORD wait_for_semaphore,wait_for_mutex,m_delay;
	int m_serial;
	m_serial=((ThreadInfo*)(p))-serial ;
	m_delay=(((ThreadInfo*)(p))-delay );
	Sleep(m_delay*1000);
	printf(生产者%2d发出生产请求\n,m_serial);
	wait_for_semaphore=WaitForSingleObject(empty_semaphore,-1);
    
	wait_for_mutex=WaitForSingleObject(h_mutex,-1); //加互斥锁
	int ProducePos=FindProducePosition();//寻找可以生产的位置
	ReleaseMutex(h_mutex); //释放互斥锁
	printf(生产者%2d开始在%2d位置生产\n,m_serial,ProducePos);
	Buffer_Critical[ProducePos]=m_serial;
	printf(生产者%2d完成生产:\n,m_serial);
	printf(位置%2d:%3d\n,ProducePos,Buffer_Critical[ProducePos]);
	ReleaseSemaphore(h_Semaphore[m_serial],n_Thread,NULL);
}
2.消费者进程
void Consume(void *p)//消费者进程
{
	DWORD wait_for_semaphore,m_delay;
	int m_serial,m_requestNum;
	int m_thread_request[MAX_THREAD_NUM];
	m_serial=((ThreadInfo*)(p))-serial ;
	m_delay=((ThreadInfo*)(p))-delay ;
	m_requestNum=((ThreadInfo*)(p))-n_request ;
	for(int i=0;im_requestNum;i++)
	{
		m_thread_request[i]=((ThreadInfo*)(p))-thread_request [i];
	}
	Sleep(m_delay*1000);
	for(i=0;iThread_Info[m_serial-1].n_request;i++)
	{
      //超前判断是否存在死锁
      if(DeadLock(m_thread_request[i],m_delay,m_serial)==true)
		{
           //如果存在,就交换解除死锁
			ChangePosition(m_serial,m_thread_request[i]);
			for(int j=0;jThread_Info[m_serial-1].n_request;j++)
			{
		    m_thread_request[j]=Thread_Info[m_serial-1].thread_request[j];
			}
		}
		printf(消费者%2d请求消费%2d产品\n,m_serial,m_thread_request[i]);
		wait_for_semaphore=WaitForSingleObject(h_Semaphore[m_thread_request[i]],-1);
		int BufferPos=FindBufferPosition(m_thread_request[i]);
		if(BufferPos==-1)
			return ;
        //进入临界区
		EnterCriticalSection(PC_Critical[BufferPos]);
		printf(消费者%2d开始消费%2d产品\n,m_serial,m_thread_request[i]);
		((ThreadInfo*)(p))-thread_request [i]=-1;
		if(!IfInOtherRequest(m_thread_request[i])){
			Buffer_Critical[BufferPo
                
原创力文档
                        

文档评论(0)