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_ */


p_c.cpp

//============================================================================// 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_ */


p_c.cpp

//============================================================================// 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
原创粉丝点击