生产者消费者及线程加锁

#include <queue>
#include <pthread.h>

// 产品队列
int ready=0;

//互斥锁
pthread_mutex_t  mutex;

//条件变量
pthread_cond_t has_product;

std::queue<char *> queue1;

//生产者

void * produce(void *arg){

    char* name=(char*)arg;
    LOGI("生产 %s", name);
    for(;;){
        //锁住
        pthread_mutex_lock(&mutex);
        ready++;
        queue1.push(name);
        LOGI("生产者  生产 %d \n",ready);
        //发送一条解锁消息
        pthread_cond_signal(&has_product);
        //解锁
        pthread_mutex_unlock(&mutex);
        sleep(3);
    }
}

//消费者
void* consumer(void* arg){
    char* name=(char*)arg;
    for(;;){
        pthread_mutex_lock(&mutex);
        //如果产品列表为空   继续等待不可能只有1个消费者
        while(ready==0){
            LOGI("没有产品了");
            pthread_cond_wait(&has_product,&mutex);
        }
        //加锁
        ready--;
        char * result = queue1.front();
        queue1.pop();
        LOGI("消费者 %s  剩余 %s, %d\n",name,result, ready);
        pthread_mutex_unlock(&mutex);
        sleep(1);
    }

}
void runtest(){
    pthread_mutex_init(&mutex,NULL);

    pthread_cond_init(&has_product,NULL);
    //线程的引用
    pthread_t tid1,tid2,tid3;
    char* name = "生产者";
    char* name1 = "消费者1";
    char* name2 = "消费者2";
        pthread_create(&tid1, NULL, produce, name);
		pthread_create(&tid2,NULL,consumer,name1);
		pthread_create(&tid3,NULL,consumer,name2);

    LOGI("开启线程");
    void *rval;
    pthread_join(tid1,&rval);
    pthread_join(tid2,&rval);
    pthread_join(tid3,&rval);

    LOGI("线程结束%d\n",rval);

}



运行结果:

11-04 19:44:40.250 11553-11620/com.test.videoplayer I/videoplayer: 生产者  生产 1 
11-04 19:44:40.250 11553-11621/com.test.videoplayer I/videoplayer: 消费者 消费者1  剩余 生产者, 0
11-04 19:44:41.250 11553-11621/com.test.videoplayer I/videoplayer: 没有产品了
11-04 19:44:43.250 11553-11620/com.test.videoplayer I/videoplayer: 生产者  生产 1 
11-04 19:44:43.250 11553-11622/com.test.videoplayer I/videoplayer: 消费者 消费者2  剩余 生产者, 0
11-04 19:44:44.250 11553-11622/com.test.videoplayer I/videoplayer: 没有产品了
11-04 19:44:46.250 11553-11620/com.test.videoplayer I/videoplayer: 生产者  生产 1 
11-04 19:44:46.250 11553-11621/com.test.videoplayer I/videoplayer: 消费者 消费者1  剩余 生产者, 0
11-04 19:44:47.250 11553-11621/com.test.videoplayer I/videoplayer: 没有产品了
11-04 19:44:49.250 11553-11620/com.test.videoplayer I/videoplayer: 生产者  生产 1 
11-04 19:44:49.250 11553-11622/com.test.videoplayer I/videoplayer: 消费者 消费者2  剩余 生产者, 0
11-04 19:44:50.250 11553-11622/com.test.videoplayer I/videoplayer: 没有产品了
11-04 19:44:52.250 11553-11620/com.test.videoplayer I/videoplayer: 生产者  生产 1 
11-04 19:44:52.250 11553-11621/com.test.videoplayer I/videoplayer: 消费者 消费者1  剩余 生产者, 0
11-04 19:44:53.250 11553-11621/com.test.videoplayer I/videoplayer: 没有产品了
11-04 19:44:55.250 11553-11620/com.test.videoplayer I/videoplayer: 生产者  生产 1 
11-04 19:44:55.250 11553-11622/com.test.videoplayer I/videoplayer: 消费者 消费者2  剩余 生产者, 0
11-04 19:44:56.250 11553-11622/com.test.videoplayer I/videoplayer: 没有产品了
11-04 19:44:58.250 11553-11620/com.test.videoplayer I/videoplayer: 生产者  生产 1 
11-04 19:44:58.250 11553-11621/com.test.videoplayer I/videoplayer: 消费者 消费者1  剩余 生产者, 0
11-04 19:44:59.250 11553-11621/com.test.videoplayer I/videoplayer: 没有产品了
11-04 19:45:01.250 11553-11620/com.test.videoplayer I/videoplayer: 生产者  生产 1 
11-04 19:45:01.250 11553-11622/com.test.videoplayer I/videoplayer: 消费者 消费者2  剩余 生产者, 0
11-04 19:45:02.250 11553-11622/com.test.videoplayer I/videoplayer: 没有产品了
11-04 19:45:04.250 11553-11620/com.test.videoplayer I/videoplayer: 生产者  生产 1 
11-04 19:45:04.250 11553-11621/com.test.videoplayer I/videoplayer: 消费者 消费者1  剩余 生产者, 0
11-04 19:45:05.260 11553-11621/com.test.videoplayer I/videoplayer: 没有产品了


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值