生产者与消费者模型,简单实例(一个生产者,一个消费者)
来源:互联网 发布:java方法的声明 编辑:程序博客网 时间:2024/06/06 00:42
注:程序中首先创建两个信号量g_hSmprPrdc、g_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
- 生产者与消费者模型,简单实例(一个生产者,一个消费者)
- 一个简单的生产者消费者
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- 生产者与消费者模型
- jbpm4.3表结构和表字段说明
- Dom树:(Node)结点树
- APK文件与odex文件反编译
- WM_CLOSE WM_DESTROY WM_QUIT 区别
- 剑指off T3 杨氏矩阵搜索算法
- 生产者与消费者模型,简单实例(一个生产者,一个消费者)
- C++语法细节(1)
- 计算机的书
- http://stackoverflow.com/questions/19157977/ld-symbol-dyld-stub-binding-helper-not-found-normally-in
- java 异常以及回收机制 工作笔记
- 获取地球某点最新的磁偏角
- unix环境线程编程练习
- 二叉树先(中)(后)序遍历
- iOS应用程序生命周期(前后台切换,应用的各种状态)详解