生产者消费者及线程加锁
来源:互联网 发布:人工智能的原理与作用 编辑:程序博客网 时间: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: 没有产品了
阅读全文
0 0
- 生产者消费者及线程加锁
- 线程间通信:生产者消费者(都要加锁,且为同一把锁)
- 加锁情况下生产者消费者的应用
- 线程,生产者,消费者
- 生产者、消费者 线程同步
- 生产者,消费者线程
- 线程生产者与消费者
- 线程---生产者与消费者
- java 线程生产者消费者
- 生产者消费者线程
- 线程生产者消费者
- 线程同步--生产者消费者
- 线程之“生产者消费者”
- linux线程-生产者/消费者
- 生产者消费者线程
- 线程之生产者消费者
- 线程--生产者消费者模式
- 线程之生产者、消费者
- linux常用终端指令+如何用vim写一个c程序并运行
- 关于数据库原理总结1
- leaflet-自定义底图
- SSH Tutorial for linux
- [HideInInspector] [Obsolete ]
- 生产者消费者及线程加锁
- Open edX架构
- 抽象类-学生-研究生-收入-教师
- c++stl中的map/multimap
- poj-1751-Highways-最小生成树
- Java的lombok注解
- JavaScript-day16-个人学习笔记
- Linux入门笔记4. 菜鸟的常用命令
- hdu2955的01背包问题