生产者消费者线程
来源:互联网 发布:手机淘宝支付宝在哪里 编辑:程序博客网 时间:2024/05/20 09:26
#include<iostream> #include<stdlib.h> #include<stdio.h> #include<windows.h> using namespace std; typedef int semaphore;/*信号量是一种特殊的整型变量*/ const int SIZE_OF_BUFFER=5;//缓冲区长度 const unsigned short PRODUCERS_COUNT=2;//生产者的个数 const unsigned short CONSUMERS_COUNT=3;//消费者的个数 DWORD producers[PRODUCERS_COUNT];//生产者线程的标识符 DWORD consumers[CONSUMERS_COUNT];//消费者线程的标识符 const unsigned short THREADS_COUNT=PRODUCERS_COUNT+CONSUMERS_COUNT;//总的线程数 /** *定义信号量*/ HANDLE mutex;//互斥信号量 HANDLE full;//表示放有产品的缓冲区数,其初值为0 HANDLE empty;//表示可供使用的缓冲区数,其初值为N /** *定义共享缓冲区*/ semaphore buffer[SIZE_OF_BUFFER];/** *定义生产者和消费者使用的指针*/ int in=0; int out=0; int productNum=0; DWORD WINAPI Producer(LPVOID); DWORD WINAPI Consumer(LPVOID); int main(int argc,char*argv[]) {//创建Mutex和Semaphore 44.mutex=CreateMutex(NULL,FALSE,NULL);full=CreateSemaphore(NULL,0,SIZE_OF_BUFFER,NULL);empty=CreateSemaphore(NULL,SIZE_OF_BUFFER,SIZE_OF_BUFFER,NULL);HANDLE PVThreads[THREADS_COUNT];//各线程的handle //创建生产者线程 for(int i=0;i<PRODUCERS_COUNT;i++){ PVThreads[i]=CreateThread(NULL,0,Producer,NULL,0,&producers[i]);if(PVThreads[i]==NULL)break; }//创建消费者线程 for(int i=0;i<CONSUMERS_COUNT;i++){ PVThreads[PRODUCERS_COUNT+i]=CreateThread(NULL,0,Consumer,NULL,0,&consumers[i]);if(PVThreads[i]==NULL)break; }bool isContinue=true; while(isContinue) {if(getchar()){//按回车后终止程序运行 isContinue=false; }}system("PAUSE"); return 0; }void enBuffer(int pos) {cout<<"正在生产产品..."<<endl; Sleep(2000);buffer[pos]=-1;productNum++;cout<<"生产完成!已生产"<<productNum<<"个产品,并将新产品放在了缓冲区位置:"<<pos<<endl; }void deBuffer(int pos) {cout<<"正在消费产品..."<<endl; Sleep(1000);buffer[pos]=-2;productNum--;cout<<"已消费在缓冲区位置:"<<pos<<"的产品,缓冲区剩余空间:"<<SIZE_OF_BUFFER-productNum<<endl; cout<<endl;}/** *生产者*/ DWORD WINAPI Producer(LPVOID lpParam) {while(1) {WaitForSingleObject(empty,INFINITE);//P(empty)生产者信号量-1 WaitForSingleObject(mutex,INFINITE);//P(mutex)获取线程间互斥信号 enBuffer(in);Sleep(1000);in=(in+1)%SIZE_OF_BUFFER;ReleaseMutex(mutex);//V(mutex)释放线程间互斥信号 ReleaseSemaphore(full,1,NULL);//V(full)消费者信号量+1}return 0; }/** *消费者*/ DWORD WINAPI Consumer(LPVOID lpPara) {while(1) {WaitForSingleObject(full,INFINITE);//P(full)消费者信号量-1 WaitForSingleObject(mutex,INFINITE);//P(mutex)获得线程间互斥信号 deBuffer(out);Sleep(1000);out=(out+1)%SIZE_OF_BUFFER;ReleaseMutex(mutex);//V(mutex)释放线程间互斥信号 ReleaseSemaphore(empty,1,NULL);//V(empty)生产者信号量+1 126.127.}return 0; }
0 0
- 线程,生产者,消费者
- 生产者、消费者 线程同步
- 生产者,消费者线程
- 线程生产者与消费者
- 线程---生产者与消费者
- java 线程生产者消费者
- 生产者消费者线程
- 线程生产者消费者
- 线程同步--生产者消费者
- 线程之“生产者消费者”
- linux线程-生产者/消费者
- 生产者消费者线程
- 线程之生产者消费者
- 线程--生产者消费者模式
- 线程之生产者、消费者
- 生产者线程和消费者线程
- 线程-生产者消费者问题
- 线程(消费者与生产者)
- MFC 对话框打开文件失败(GetOpenFileName())
- 利用GeneratedKeyHolder获得新建数据主键值
- cocos2D(八)---- CCMenu && CCMenuItem
- 电流镜中cascode效应的学习笔记
- iOS的alamofire框架的json解析方法,服务器传过来的json格式一定要是标准的格式,否则会报以下错误
- 生产者消费者线程
- 匿名内部类的作用
- 查询重复记录的SQL语句
- redhat 9 下sqlite 3的安装及编程
- Spring 使用注解方式进行事务管理
- C# 线程中调用控件出错
- NSDate
- 什么情况下要有拷贝构造函数
- linux shell 命令中-d, -f, -e等等判断表达式(文件比较运算符 )的相关解释