线程之路五:消费者生产者
来源:互联网 发布:流星蝴蝶剑轻功 知乎 编辑:程序博客网 时间:2024/05/14 10:36
一个生产者,10个消费者,4个缓冲区
//有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,//在两者之间设置一个具有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,//显然生产者和消费者之间必须保持同步,//即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经放入产品的缓冲区中再次投放产品。#include <iostream>#include <Windows.h>#include <process.h>using namespace std;//设置控制台输出颜色BOOL SetConsoleColor(WORD wAttributes){HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);if (hConsole == INVALID_HANDLE_VALUE)return FALSE;return SetConsoleTextAttribute(hConsole, wAttributes);}CRITICAL_SECTION ad;HANDLE semaphore,eve,it;const int n = 10;//消费者数目const int buffersize=4;//缓冲区个数//缓冲池int buffer[buffersize];int buffernum =0;int buffernum2 =0;////消费者unsigned int __stdcall customer(LPVOID pm){WaitForSingleObject(semaphore,INFINITE);EnterCriticalSection(&ad);int i = *((int*)pm);SetEvent(it);SetConsoleColor(FOREGROUND_GREEN); cout<<"消费者"<<GetCurrentThreadId()<<"在第"<<(i-1)%buffersize+1<<"缓冲池取出数据"<<buffer[(i-1)%buffersize]<<endl;SetConsoleColor(FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_BLUE); LeaveCriticalSection(&ad);ReleaseSemaphore(eve,1,NULL);return 0;}//生产者unsigned int __stdcall produce(LPVOID pm){for (auto i =0;i<n;i++){WaitForSingleObject(eve,INFINITE);EnterCriticalSection(&ad);buffer[buffernum] =i;cout<<"生产者"<<GetCurrentThreadId()<<"在第"<<buffernum+1<<"缓冲池生产数据"<<buffer[buffernum]<<endl;buffernum=(i+1)%buffersize;LeaveCriticalSection(&ad);ReleaseSemaphore(semaphore,1,NULL);}return 0;}void main(){InitializeCriticalSection(&ad);it = CreateEvent(NULL,FALSE,FALSE,NULL);semaphore = CreateSemaphore(NULL,0,buffersize,NULL);//缓冲空的个数eve =CreateSemaphore(NULL,buffersize,buffersize,NULL);//缓冲产品个数HANDLE handle[n+1];handle[0] = (HANDLE)_beginthreadex(NULL,0,produce,NULL,0,NULL);for(int i=1;i<n+1;i++){handle[i] = (HANDLE)_beginthreadex(NULL,0,customer,&i,0,NULL);WaitForSingleObject(it,INFINITE);}WaitForMultipleObjects(n,handle,true,INFINITE);system("pause");for (auto j =0;j <2;j++){CloseHandle(handle[j]);}CloseHandle(semaphore);CloseHandle(eve);CloseHandle(it);DeleteCriticalSection(&ad);}
0 0
- 线程之路五:消费者生产者
- 线程之“生产者消费者”
- 线程之生产者消费者
- 线程之生产者、消费者
- 线程同步之生产者消费者
- Java 线程之生产者消费者
- 线程之生产者消费者模型
- 生产者消费者问题之Java线程实现
- 线程同步之经典生产者-消费者模型
- java线程之生产者消费者问题
- java线程经典之生产者与消费者
- 线程间通信之生产者消费者问题
- 线程之消费者和生产者问题代码
- 初识线程之 生产者消费者模型
- 线程同步之生产者-消费者问题
- JAVA线程之生产者消费者问题
- Qt之线程同步(生产者消费者模式
- Qt之线程同步(生产者消费者模式
- 不能从const char *转换为LPCWSTR 经常碰到
- oracle 字符集查看与修改
- android截屏命令
- 我的助理辞职了(原文)
- The Google File System中文版附英文资源链接(下)
- 线程之路五:消费者生产者
- unity实现窗口提示代码
- JAVA集合笔记
- MFC状态栏的编程--动态时间,进度栏和鼠标位置显示
- list.h链表练习
- 面试智力题 — 时针与分针夹角度数问题
- eclipse tomcat 直接启动
- sql 2008 远程过程调用失败 0x800706be
- 地址格式 inet_pton() int_ntop()