您的位置:首页 > 其它

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

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

整体示意图如下:



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



#include "stdafx.h"
#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <process.h>

#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;
}



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: