《多生产者多消费者多个缓冲区》由会员分享,可在线阅读,更多相关《多生产者多消费者多个缓冲区(7页珍藏版)》请在金锄头文库上搜索。
1、多生产者多消费者多个缓冲区多生产者多消费者多个缓冲区#include “EOSApp.h“#define BUFFER_SIZE 10int BufferBUFFER_SIZE; /准备缓存int j=0;int OutIndex = 0;int i=0;int InIndex = 0;#define PRODUCT_COUNT 30HANDLE MutexHandle;HANDLE EmptySemaphoreHandle;HANDLE FullSemaphoreHandle; ULONG Producer(PVOID Param);/准备生产ULONG Consumer(PVOID Par
2、am);/回收/ main 函数参数的意义:/ argc - argv 数组的长度,大小至少为 1,argc - 1 为命令行参数的数量。/ argv - 字符串指针数组,数组长度为命令行参数个数 + 1。其中 argv0 固定指向当前/ 进程所执行的可执行文件的路径字符串,argv1 及其后面的指针指向各个命令行/ 参数。/ 例如通过命令行内容 “a:hello.exe -a -b“ 启动进程后,hello.exe 的 main 函/ 数的参数 argc 的值为 3,argv0 指向字符串 “a:hello.exe“,argv1 指向/ 参数字符串 “-a“,argv2 指向参数字符串 “-
3、b“。/int main(int argc, char* argv)/ 启动调试 EOS 应用程序前要特别注意下面的问题:/ 1、如果要在调试应用程序时能够调试进入内核并显示对应的源码,/ 必须使用 EOS 核心项目编译生成完全版本的 SDK 文件夹,然/ 后使用此文件夹覆盖应用程序项目中的 SDK 文件夹,并且 EOS/ 核心项目在磁盘上的位置不能改变。/ 2、在启动调试应用程序之前必须首先删除/禁用所有的断点,在断/ 点中断 (int 3) 被命中后才能重新添加/启用断点,否则启动/ 调试会失败。/HANDLE ProducerHandle3;HANDLE ConsumerHandle3;
4、#ifdef _DEBUG_asm(“int $3n nop“);#endif/* TODO: 在此处添加自己的代码 */MutexHandle = CreateMutex(FALSE,NULL);if(NULL=MutexHandle) return 1;EmptySemaphoreHandle = CreateSemaphore(BUFFER_SIZE,BUFFER_SIZE,NULL);if(NULL=EmptySemaphoreHandle) return 2;FullSemaphoreHandle = CreateSemaphore(0,BUFFER_SIZE,NULL);if(NU
5、LL=FullSemaphoreHandle) return 3;ProducerHandle0 = CreateThread( 0,Producer,NULL,0,NULL );if(NULL=ProducerHandle0)return 4;ConsumerHandle0 = CreateThread( 0,Consumer,NULL,0,NULL );if(NULL=ConsumerHandle0)return 5;ProducerHandle1= CreateThread( 0,Producer,NULL,0,NULL );if(NULL=ProducerHandle1)return
6、4;ConsumerHandle1= CreateThread( 0,Consumer,NULL,0,NULL );if(NULL=ConsumerHandle1)return 5;ProducerHandle2= CreateThread( 0,Producer,NULL,0,NULL );if(NULL=ProducerHandle2)return 6;ConsumerHandle2= CreateThread( 0,Consumer,NULL,0,NULL );if(NULL=ConsumerHandle2)return 7;WaitForSingleObject(ProducerHan
7、dle0,INFINITE);WaitForSingleObject(ConsumerHandle0,INFINITE);WaitForSingleObject(ProducerHandle1,INFINITE);WaitForSingleObject(ConsumerHandle1,INFINITE); WaitForSingleObject(ProducerHandle2,INFINITE);WaitForSingleObject(ConsumerHandle2,INFINITE);CloseHandle(MutexHandle);CloseHandle(EmptySemaphoreHan
8、dle);CloseHandle(FullSemaphoreHandle);CloseHandle(ProducerHandle0);CloseHandle(ConsumerHandle0);CloseHandle(ProducerHandle1);CloseHandle(ConsumerHandle1);CloseHandle(ProducerHandle2);CloseHandle(ConsumerHandle2);return 0;/ULONG Producer(PVOID Param)/Sleep(500);while(iPRODUCT_COUNT)WaitForSingleObjec
9、t(EmptySemaphoreHandle,INFINITE);WaitForSingleObject(MutexHandle,INFINITE);printf(“ Produce %dn“,i);BufferInIndex = i;InIndex = (InIndex+1)%BUFFER_SIZE;ReleaseMutex(MutexHandle);ReleaseSemaphore(FullSemaphoreHandle,1,NULL);i+;Sleep(500);return 0;ULONG Consumer(PVOID Param)while(jPRODUCT_COUNT)WaitForSingleObject(FullSemaphoreHandle,INFINITE);WaitForSingleObject(MutexHandle,INFINITE);printf(“ttt Consume %dn“,BufferOutIndex);OutIndex = (OutIndex+1)%BUFFER_SIZE;j+;ReleaseMutex(MutexHandle);ReleaseSemaphore(EmptySemaphoreHandle,1,NULL);if(i10)Sleep(2000);elseSleep(100);return 0;