生产者与消费者模型,简单实例(一个生产者,一个消费者)

注:程序中首先创建两个信号量g_hSmprPrdcg_hSmprCsm,二者用于生产者和消费者线程的同步,保证当缓冲区队列满的时候生产者停止运行,缓冲区队列空的时候消费者停止运行。然后创建互斥量g_hMutex,用于对缓冲区的互斥访问,也就是说生产者和消费者不能同时访问缓冲区队列,其中缓冲区队列使用的是圆形缓冲区队列。

整体示意图如下:

生产者与消费者模型,简单实例(一个生产者,一个消费者)_第1张图片

终程序运行结果图如下所示:

生产者与消费者模型,简单实例(一个生产者,一个消费者)_第2张图片

#include "stdafx.h"
#include 
#include 
#include 
#include 

#define  BUF_SIZE  5

int in, out, buf[BUF_SIZE];				//	生产者、消费者互斥访问缓冲区
HANDLE g_hSmprPrdc;					//	信号量句柄(记录缓冲区空闲的槽数,用于保证生产者和消费者对缓冲区的同步访问)
HANDLE g_hSmprCsm;					//	信号量句柄(记录缓冲区内满的槽数)
HANDLE g_hMutex;					//	互斥量句柄(用于保证生产者和消费者不会同时访问共享缓冲区)

DWORD WINAPI Producer(LPVOID p)
{
	for(int i=0; i<=32768; i++)
	{
		WaitForSingleObject(g_hSmprPrdc,INFINITE);		//	保证同步(即:缓冲区满的时候生产者停止运行)
		WaitForSingleObject(g_hMutex,INFINITE);			//	生产者和消费者不能同时访问缓冲区(保证互斥)
		in = (in+1)%BUF_SIZE;
		buf[in] = i;
		printf("produce %d\n", buf[in]);
		ReleaseMutex(g_hMutex);
		ReleaseSemaphore(g_hSmprCsm, 1, NULL);			
	}
	return 0;
}

DWORD WINAPI Consumer(LPVOID lpparameter)
{
	for(; ;)
	{
		WaitForSingleObject(g_hSmprCsm, INFINITE);		//	保证同步(缓冲区空的时候,消费者停止运行)
		WaitForSingleObject(g_hMutex, INFINITE);
		out = (out+1)%BUF_SIZE;
		printf("customer %d\n", buf[out]);
		ReleaseMutex(g_hMutex);
		ReleaseSemaphore(g_hSmprPrdc, 1, NULL);
	}
	return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
	HANDLE hPrdcThread, hCsmThread;
	
	in = out = -1;
	g_hSmprPrdc = CreateSemaphore(NULL, BUF_SIZE, BUF_SIZE,NULL);	//	创建用于同步的信号量(缓冲区空闲的槽数等于信号量的计数)
	g_hSmprCsm = CreateSemaphore(NULL, 0, BUF_SIZE, NULL);		//	创建用于同步的信号量(缓冲区已利用的槽数等于信号量的计数)
	g_hMutex = CreateMutex(NULL, FALSE, _T("Pr"));			//	创建互斥量用于互斥访问缓冲区

	hPrdcThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Producer, NULL, 0, NULL);	//	创建生产者
	hCsmThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE)Consumer, NULL, 0, NULL);	//	创建消费者
	CloseHandle(hCsmThread);								//	关闭句柄
	CloseHandle(hPrdcThread);								//	关闭句柄

	while(TRUE);

	return 0;
}




你可能感兴趣的:(多线程编程)