windows下(互斥量和事件对象)实现简单象消费者和生产者线程

#include <iostream>
#include <windows.h>
#include <process.h>

using namespace std;

#define Thread_COUNT 1   
#define PRODUCERS_COUNT 1  
HANDLE hEvent=NULL;
HANDLE hMutex=NULL;
HANDLE hThread[Thread_COUNT];
unsigned   m_conThreadID=0;  
unsigned   m_conThreadID1=0;  
unsigned   m_proThreadID1=0;  
unsigned   m_proThreadID=0;
int nReady=0;
 unsigned   __stdcall consume(LPVOID lpParam)
{
	int number=(int)lpParam;
	cout<<"线程1 id:"<<GetCurrentThreadId()<<endl;
	while(true)
	{

		DWORD dw=WaitForSingleObject(hMutex,INFINITE);
		if (dw==WAIT_OBJECT_0)
		{

		cout<<"=============consume thread  working============================"<<endl;
	    while (nReady==0)
		{
           cout<<"number--"<<number<<"begin wait a  condtion... "<<endl;
		   SignalObjectAndWait(hMutex,hEvent,INFINITE,FALSE);
		}
		 // WaitForSingleObject(hMutex,INFINITE);
		 // ReleaseMutex(hMutex);
		 cout<<"number--"<<number<<"end wait a condtion... "<<endl;
		
		 cout<<"number--"<<number<<"begin consume produce... "<<endl;
		
		  --nReady;
		 cout<<"number--:"<<number<<"消费剩余是:"<<nReady<<endl;
		 cout<<"number--:"<<number<<"end consume product... "<<endl;
	    ReleaseMutex(hMutex);
		Sleep(1000);
	   }else{
			SetLastError(ERROR_TIMEOUT);
			cout<<"number--:"<<number<<"-------------等待超时。。。。。。。。。----------"<<endl;
		}
	}
   return 0;
}
 unsigned   __stdcall  produce(LPVOID lpParam)
{
	cout<<"线程2 id:"<<GetCurrentThreadId()<<endl;
	int number=(int)lpParam;
	while(true)
	{
		DWORD dw=WaitForSingleObject(hMutex,INFINITE);
		if (dw==WAIT_OBJECT_0)
		{
		
		 cout<<"number-----:"<<number<<"=============produce thread working============================"<<endl;
		cout<<"begin produce product... "<<endl;
		++nReady;
		 cout<<"number--:"<<number<<"end produce product... "<<endl;
		
		if (nReady>0)
		{
		cout<<"number--:"<<number<<"生产总量是:"<<nReady<<endl;
		SetEvent(hEvent);
	    cout<<"number--:"<<number<<"---------------通知等待线程-----------"<<endl;
		}
		ReleaseMutex(hMutex);
		Sleep(2000);
		}else{
		  SetLastError(ERROR_TIMEOUT);
		  cout<<"number--:"<<number<<"-------------等待超时。。。。。。。。。----------"<<endl;
		}
	}


	return 0;
}


int main()
{
	hEvent=CreateEvent(NULL,FALSE,FALSE,NULL);//第二个参数表示,TRUE表示手动(事件触发时,所有等待线程编程可调度状态),FALSE表示自动重置(事件触发时,只有一个等待线程编程可调度状态)。
	hMutex = CreateMutex(NULL,FALSE,NULL);
	
	_beginthreadex(NULL,0,&consume, (void*)1,0,&m_conThreadID);  //NULL表示无
	Sleep(1000);
	_beginthreadex(NULL,0,&consume, (void*)2,0,&m_conThreadID);  //NULL表示无
	//hThread[1]=(HANDLE)::_beginthreadex(NULL,0,&consume, (void*)2,0,&m_conThreadID);  //NULL表示无
	Sleep(1000);
	//	hThread2=CreateThread(NULL,0,ThreadProc2,NULL,0,NULL);  
//	_beginthreadex(NULL,0,&produce,(void*)3,0,&m_proThreadID); 
	Sleep(1000);
	_beginthreadex(NULL,0,&produce, (void*)4,0,&m_conThreadID);  //NULL表示无
	Sleep(1000);

	
	system("pause");
	return 0;
}


如果

hEvent=CreateEvent(NULL,TRUE,FALSE,NULL);//

则会出现如下问题:

 

原因是所有等待线程都处于可调度状态

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值