C++编程实现生产者/消费者模型(linux系统编程)



参考了这篇实现相同功能的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 to
the public mailing list cygwin@cygwin.com
Produced:A
Consumed:A
Produced:B
Consumed:B
Produced:C
Consumed:C
Produced:D
Consumed:D
Produced:E
Consumed:E
Produced:F
Consumed:F
Produced:G
Consumed:G
Produced:H
Consumed:H
栈空了!
Produced:I
Consumed:I
Produced:J
Consumed:J
Produced:K
Consumed:K
Produced:L
Consumed:L
Produced:M
Consumed:M
Produced:N
Consumed:N
Produced:O
Consumed:O
Produced:P
Produced:Q
Consumed:Q
Consumed:P
Produced:R
Consumed:R
Produced:S
Consumed:S
Produced:T
Produced:U
Consumed:U
Consumed:T
Produced:V
Consumed:V
Produced:W
Produced:X
Consumed:X
Consumed:W
Produced:Y
Produced:Z
Consumed:Z
Consumed: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 to
the public mailing list cygwin@cygwin.com
Produced:A
Consumed:A
Produced:B
Consumed:B
Produced:C
Consumed:C
Produced:D
Consumed:D
Produced:E
Consumed:E
Produced:F
Consumed:F
Produced:G
Consumed:G
Produced:H
Consumed:H
栈空了!
Produced:I
Consumed:I
Produced:J
Consumed:J
Produced:K
Consumed:K
Produced:L
Consumed:L
Produced:M
Consumed:M
Produced:N
Consumed:N
Produced:O
Consumed:O
Produced:P
Produced:Q
Consumed:Q
Consumed:P
Produced:R
Consumed:R
Produced:S
Consumed:S
Produced:T
Produced:U
Consumed:U
Consumed:T
Produced:V
Consumed:V
Produced:W
Produced:X
Consumed:X
Consumed:W
Produced:Y
Produced:Z
Consumed:Z
Consumed:Y
栈空了!
栈空了!
栈空了!



  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
生产者消费者问题是一个经典的并发编程问题,可以使用多种编程语言实现。下面是使用 C++ 实现生产者消费者问题的示例代码: ```c++ #include <iostream> #include <queue> #include <thread> #include <mutex> #include <condition_variable> using namespace std; const int kMaxSize = 10; // 缓冲区最大容量 queue<int> buffer; // 缓冲区 mutex mtx; // 互斥锁,保护缓冲区 condition_variable not_full_cv, not_empty_cv; // 条件变量,用于线程同步 void producer() { for (int i = 1; i <= 20; ++i) { unique_lock<mutex> lock(mtx); not_full_cv.wait(lock, [] { return buffer.size() < kMaxSize; }); // 等待缓冲区未满 buffer.push(i); cout << "producer: " << i << endl; not_empty_cv.notify_all(); // 通知消费者线程缓冲区不为空 } } void consumer() { int data = 0; while (data != 20) { unique_lock<mutex> lock(mtx); not_empty_cv.wait(lock, [] { return !buffer.empty(); }); // 等待缓冲区不为空 data = buffer.front(); buffer.pop(); cout << "consumer: " << data << endl; not_full_cv.notify_all(); // 通知生产者线程缓冲区未满 } } int main() { thread prod(producer); thread cons(consumer); prod.join(); cons.join(); return 0; } ``` 这个程序中,生产者线程不断向缓冲区中生产数据,消费者线程不断从缓冲区中消费数据,直到生产者线程生产完数据并退出。在程序中,使用互斥锁保护了缓冲区,防止多个线程同时访问,使用条件变量实现了线程同步。`not_full_cv` 条件变量用于通知生产者线程缓冲区未满,`not_empty_cv` 条件变量用于通知消费者线程缓冲区不为空。在生产者线程和消费者线程中,使用 `wait` 函数等待条件变量满足,当条件变量满足时再执行相应的操作,并使用 `notify_all` 函数通知其他线程条件变量已经满足,可以继续执行。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值