C++编程实现生产者/消费者模型(linux系统编程)
来源:互联网 发布:中国人工智能学校排名 编辑:程序博客网 时间:2024/06/05 16:44
参考了这篇实现相同功能的java程序http://www.cnblogs.com/linjiqin/archive/2011/04/15/2016820.html
代码如下:
p_c.h
/* * p_c.h * * Created on: 2016年6月28日 * Author: ZhangXianYi */#ifndef P_C_H_#define P_C_H_//============================================================================// Name : p_c.cpp// Author : ZhangXianYi// Version : 1.0// Copyright : Your copyright notice// Description : 模拟生产者/消费者的程序//============================================================================//析构函数 和 赋初值 注意一下#include <iostream>#include <pthread.h>#include <stdio.h>#include <unistd.h>#include <errno.h>#include <stdlib.h>class SynchronizedStack{public: char ss[100]; int index; pthread_mutex_t mutex; SynchronizedStack (); ~SynchronizedStack (); void push(char c); char pop();};void * Consumer(void *arg);void * Producer(void *arg);#endif /* P_C_H_ */
//============================================================================// Name : p_c.cpp// Author : ZhangXianYi// Version : 1.0// Copyright : Your copyright notice// Description : 模拟生产者/消费者的程序//============================================================================//析构函数 和 赋初值 注意一下#include "p_c.h"using namespace std;SynchronizedStack::SynchronizedStack (){ index = -1; for(int i=0;i<100;i++) ss[i] = 'a'; pthread_mutex_init(&mutex,NULL);}SynchronizedStack::~SynchronizedStack (){ pthread_mutex_destroy(&mutex);}void SynchronizedStack::push(char c){ if(index<100) ss[++index] = c; else cout << "ss满了!"<< endl;}char SynchronizedStack::pop(){ char s=')'; if(index>=0) s = ss[index--]; else cout << "栈空了!" << endl; return s;}void * Consumer(void *arg){ SynchronizedStack *temp = (SynchronizedStack *)arg; char s; for(int i=0;i<30;i++) { pthread_mutex_lock(&(temp->mutex)); s = temp->pop(); if(s!=')') cout << "Consumed:" << s << endl; pthread_mutex_unlock(&(temp->mutex)); sleep(1); }}void * Producer(void *arg){ SynchronizedStack *temp = (SynchronizedStack *)arg; for(int i=0;i<26;i++) { pthread_mutex_lock(&(temp->mutex)); temp->push((char)(i+65)); cout << "Produced:" << temp->ss[temp->index] << endl; pthread_mutex_unlock(&(temp->mutex)); sleep(1); }}main.cpp
/* * Main.cpp * * Created on: 2016年6月28日 * Author: administrator */#include "p_c.h"int main(){ pthread_t pid1,pid2; int error1,error2; error1 = 0; error2 = 0; SynchronizedStack * quyu = new SynchronizedStack (); error2=pthread_create(&pid2,NULL,Producer,quyu); error1=pthread_create(&pid1,NULL,Consumer,quyu); if(error1!=0 || error2!=0) { printf("pthread_cread failed"); return 0; } pthread_join(pid1,NULL); pthread_join(pid2,NULL); return 0;}
最初也尝试过将加解锁的两行放在pop push函数里,结果打印的时候回串,所以放到线程要执行的函数里去了。
某一次运行结果如下:
0 [main] p_c 16612 find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer. Please report this problem tothe public mailing list cygwin@cygwin.comProduced:AConsumed:AProduced:BConsumed:BProduced:CConsumed:CProduced:DConsumed:DProduced:EConsumed:EProduced:FConsumed:FProduced:GConsumed:GProduced:HConsumed:H栈空了!Produced:IConsumed:IProduced:JConsumed:JProduced:KConsumed:KProduced:LConsumed:LProduced:MConsumed:MProduced:NConsumed:NProduced:OConsumed:OProduced:PProduced:QConsumed:QConsumed:PProduced:RConsumed:RProduced:SConsumed:SProduced:TProduced:UConsumed:UConsumed:TProduced:VConsumed:VProduced:WProduced:XConsumed:XConsumed:WProduced:YProduced:ZConsumed:ZConsumed:Y栈空了!栈空了!栈空了!
参考了这篇实现相同功能的java程序http://www.cnblogs.com/linjiqin/archive/2011/04/15/2016820.html
代码如下:
p_c.h
/* * p_c.h * * Created on: 2016年6月28日 * Author: ZhangXianYi */#ifndef P_C_H_#define P_C_H_//============================================================================// Name : p_c.cpp// Author : ZhangXianYi// Version : 1.0// Copyright : Your copyright notice// Description : 模拟生产者/消费者的程序//============================================================================//析构函数 和 赋初值 注意一下#include <iostream>#include <pthread.h>#include <stdio.h>#include <unistd.h>#include <errno.h>#include <stdlib.h>class SynchronizedStack{public: char ss[100]; int index; pthread_mutex_t mutex; SynchronizedStack (); ~SynchronizedStack (); void push(char c); char pop();};void * Consumer(void *arg);void * Producer(void *arg);#endif /* P_C_H_ */
//============================================================================// Name : p_c.cpp// Author : ZhangXianYi// Version : 1.0// Copyright : Your copyright notice// Description : 模拟生产者/消费者的程序//============================================================================//析构函数 和 赋初值 注意一下#include "p_c.h"using namespace std;SynchronizedStack::SynchronizedStack (){ index = -1; for(int i=0;i<100;i++) ss[i] = 'a'; pthread_mutex_init(&mutex,NULL);}SynchronizedStack::~SynchronizedStack (){ pthread_mutex_destroy(&mutex);}void SynchronizedStack::push(char c){ if(index<100) ss[++index] = c; else cout << "ss满了!"<< endl;}char SynchronizedStack::pop(){ char s=')'; if(index>=0) s = ss[index--]; else cout << "栈空了!" << endl; return s;}void * Consumer(void *arg){ SynchronizedStack *temp = (SynchronizedStack *)arg; char s; for(int i=0;i<30;i++) { pthread_mutex_lock(&(temp->mutex)); s = temp->pop(); if(s!=')') cout << "Consumed:" << s << endl; pthread_mutex_unlock(&(temp->mutex)); sleep(1); }}void * Producer(void *arg){ SynchronizedStack *temp = (SynchronizedStack *)arg; for(int i=0;i<26;i++) { pthread_mutex_lock(&(temp->mutex)); temp->push((char)(i+65)); cout << "Produced:" << temp->ss[temp->index] << endl; pthread_mutex_unlock(&(temp->mutex)); sleep(1); }}main.cpp
/* * Main.cpp * * Created on: 2016年6月28日 * Author: administrator */#include "p_c.h"int main(){ pthread_t pid1,pid2; int error1,error2; error1 = 0; error2 = 0; SynchronizedStack * quyu = new SynchronizedStack (); error2=pthread_create(&pid2,NULL,Producer,quyu); error1=pthread_create(&pid1,NULL,Consumer,quyu); if(error1!=0 || error2!=0) { printf("pthread_cread failed"); return 0; } pthread_join(pid1,NULL); pthread_join(pid2,NULL); return 0;}
最初也尝试过将加解锁的两行放在pop push函数里,结果打印的时候回串,所以放到线程要执行的函数里去了。
某一次运行结果如下:
0 [main] p_c 16612 find_fast_cwd: WARNING: Couldn't compute FAST_CWD pointer. Please report this problem tothe public mailing list cygwin@cygwin.comProduced:AConsumed:AProduced:BConsumed:BProduced:CConsumed:CProduced:DConsumed:DProduced:EConsumed:EProduced:FConsumed:FProduced:GConsumed:GProduced:HConsumed:H栈空了!Produced:IConsumed:IProduced:JConsumed:JProduced:KConsumed:KProduced:LConsumed:LProduced:MConsumed:MProduced:NConsumed:NProduced:OConsumed:OProduced:PProduced:QConsumed:QConsumed:PProduced:RConsumed:RProduced:SConsumed:SProduced:TProduced:UConsumed:UConsumed:TProduced:VConsumed:VProduced:WProduced:XConsumed:XConsumed:WProduced:YProduced:ZConsumed:ZConsumed:Y栈空了!栈空了!栈空了!
0 0
- C++编程实现生产者/消费者模型(linux系统编程)
- Linux 多线程编程(实现生产者消费者模型)
- <网络编程培训之二> 编程实现生产者与消费者问题(linux下C实现)
- linux c pv 实现生产者消费者模型
- 生产者消费者模型,C/C++实现(Linux)
- Kafka消费者生产者编程模型(二)
- Linux系统编程——生产者与消费者(二)
- Linux实现生产者消费者模型
- linux进程并发模型生产者和消费者模式编程
- 【每天一点linux】多线程编程之生产者消费者模型
- 编程实现生产者消费者问题
- 生产者与消费者模型Linux下C语言的实现
- linux c语言实现队列及用于生产者消费者模型
- Linux C:利用两个线程实现生产者消费者模型
- linux系统编程中的信号量--模拟生产者与消费者
- Linux系统编程——生产者与消费者问题
- 【Java并发编程】:生产者—消费者模型(含代码)
- java并发编程(十六)--生产者—消费者模型
- TCP/IP 网络协议基础
- surfaceview-自定義畫圖或顯示圖片
- how to create igllib project independently(effective on 28/6/2016)
- 图中连通块的个数:并查集
- java,方法重写,final
- C++编程实现生产者/消费者模型(linux系统编程)
- ComboBox数据绑定初始化值
- 提高项目14-当年第几天(数组方案)
- 设计模式---Builder模式
- Writing Skills for Academic English
- Spring的配置文件积累
- redis之ziplist
- Android AndFix 热修复框架
- mysql统计