#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: 没有产品了