オペレーティングシステム-信号量C++コードWIN 32
1771 ワード
#include
#include
#include
#include
#include
#define BUFFER_SIZE 5
int buffer[BUFFER_SIZE];
int cnt=0;
HANDLE Mutex,Empty,Full;
void init()
{
Mutex=CreateMutex(NULL,FALSE,NULL);
Empty=CreateSemaphore(NULL,5,5,NULL);
Full=CreateSemaphore(NULL,0,5,NULL);
}
int insert_item(int item,int order)
{
int flag=-1;
WaitForSingleObject(Empty,INFINITE);
WaitForSingleObject(Mutex,INFINITE);
if(cnt0)
{
item=buffer[cnt-1];
buffer[cnt-1]=0;
flag=0;
printf("consumer %d consumed %d
",order,cnt);
cnt--;
}
ReleaseMutex(Mutex);
ReleaseSemaphore(Empty,1,NULL);
return flag;
}
DWORD WINAPI producer(void *param)
{
srand((unsigned)time(NULL));
int random;
while(true)
{
Sleep((rand()%10+1)*1000);
if(insert_item(random,(DWORD)param))
{
printf("report error condition
");
}
}
}
DWORD WINAPI consumer(void *param)
{
srand((unsigned)time(NULL));
int random;
while(true)
{
Sleep((rand()%10+1)*1000);
if(remove_item(random,(DWORD)param))
{
printf("report error condition
");
}
}
}
int main(int argc,char *argv[])
{
init();
static const int sleepTime=1000,producerThs=10,consumerThs=10;
memset(buffer,0,sizeof buffer);
DWORD ProducerThreadId[producerThs],ConsumerThreadId[consumerThs];
HANDLE ProducerThreadHandles[producerThs],ConsumerThreadHandles[consumerThs];
int i;
for(i=0;i