生产者消费者及线程加锁

来源:互联网 发布:人工智能的原理与作用 编辑:程序博客网 时间:2024/05/16 13:09
#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  剩余 生产者, 011-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  剩余 生产者, 011-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  剩余 生产者, 011-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  剩余 生产者, 011-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  剩余 生产者, 011-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  剩余 生产者, 011-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  剩余 生产者, 011-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  剩余 生产者, 011-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  剩余 生产者, 011-04 19:45:05.260 11553-11621/com.test.videoplayer I/videoplayer: 没有产品了


原创粉丝点击