生产者与消费者模型,简单实例(一个生产者,一个消费者)
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; }
相关文章推荐
- 用BlockingQueue实现一个简单的生产者-消费者模型
- 一个简单的生产者-消费者 模型
- 一个简单的C语言操作系统生产者消费者模型
- 一个简单的生产者-消费者 模型
- Java线程(学习整理)--4---一个简单的生产者、消费者模型
- 用BlockingQueue实现一个简单的生产者-消费者模型
- C++实现简单生产者消费者模型
- Python自定义进程池实例分析【生产者、消费者模型问题】
- 简单实现带有数据缓冲池的生产者消费者模型
- Python自定义进程池实例分析【生产者、消费者模型问题】
- 一个简单的生产者/消费者例子
- socket 简单实现jms(消费者生产者模型)
- 理解生产者消费者模型及在Python编程中的运用实例
- 理解生产者消费者模型及在Python编程中的运用实例
- 使用semaphore实现生产者-消费者简单模型
- 一个生产者与消费者的简单编程案例
- Java 多线程学习之生产者消费者模型:一个较完善的实现
- 一个简单的生产者消费者
- Queue 实现生产者消费者模型(实例讲解)
- 一个ConcurrentLinkedQueue实现生产者消费者模型的例子