#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);//
则会出现如下问题:
原因是所有等待线程都处于可调度状态