信号量实现生产者消费者问题

#include "stdafx.h"
#include <iostream>
#include <stdio.h>
#include <windows.h>
#include <deque>
#include <conio.h>


HANDLE Empty,full,mutex;
int x=0;
int y=0;
std::deque<int> queue_;

void output()
{
	for (std::deque<int>::iterator it=queue_.begin(); it!=queue_.end(); ++it)
	{
		std::cout << *it;
		std::cout << "";
	}

	    std::cout<<"\n";
}

DWORD WINAPI put(LPVOID param) 
{
	int j=0;	
	do 
	{
		WaitForSingleObject(Empty,INFINITE);
		WaitForSingleObject(mutex,INFINITE);
		std::cout<<GetCurrentThreadId()<<"---"<<j<<"---";
		queue_.push_back(2); 
		output();
		j++;
		ReleaseSemaphore(mutex,1, NULL);
		ReleaseSemaphore(full,1, NULL);
	} while (j!=10);	
	return 0;

}
DWORD WINAPI take(LPVOID param)
{	
	int j=0;	
	do 
	{
		WaitForSingleObject(full,INFINITE);
		WaitForSingleObject(mutex,INFINITE);
		std::cout<<GetCurrentThreadId()<<"---"<<j<<"---";

		while (queue_.empty()) 
		{
			return 0;
		}
		queue_.pop_front();
		output();
		j++;
		ReleaseSemaphore(mutex,1, NULL);
		ReleaseSemaphore(Empty,1, NULL);	
	} while (j!=10);
	return 0;
}
int main()
{
	int i;	
	Empty=CreateSemaphore(NULL,10,10,NULL);
	full=CreateSemaphore(NULL,0,10,NULL);
	mutex=CreateSemaphore(NULL,1,1,NULL);	

	
	DWORD * ThreadId=(DWORD *)malloc(10*sizeof(DWORD*));
	HANDLE* ThreadHandle=(HANDLE*)malloc(10*sizeof(HANDLE));
	
	for (i=0;i<5;i++)
	{		ThreadHandle[i+5]=CreateThread(NULL,0,put,NULL,0,&ThreadId[i+5]);		
	ThreadHandle[i]=CreateThread(NULL,0,take,NULL,0,&ThreadId[i]);			
	}	

	WaitForMultipleObjects(10,ThreadHandle,TRUE,INFINITE);	
	getch();
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值