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

来源:互联网 发布:java方法的声明 编辑:程序博客网 时间:2024/06/06 00:42

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

整体示意图如下:

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

#include "stdafx.h"#include <stdio.h>#include <stdlib.h>#include <windows.h>#include <process.h>#define  BUF_SIZE  5int 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;}



0 0