多线程编程之生产者和消费者模型
来源:互联网 发布:华为系统源码是什么 编辑:程序博客网 时间:2024/04/25 10:03
代码一:
#include "../utili.h"#define MAX_ITEM 10000#define MAX_THREAD 5void *produce(void *), *consume(void *);struct {pthread_mutex_t mutex;int buff[MAX_ITEM];int nput;int nval;} shared = {PTHREAD_MUTEX_INITIALIZER};int main(){pthread_t tid_produce[MAX_ITEM], tid_consume;int count[MAX_THREAD];for(int i=0; i<MAX_THREAD; ++i){count[i] = 0;pthread_create(&tid_produce[i], NULL, produce, &count[i]);}for(int i=0; i<MAX_THREAD; ++i){pthread_join(tid_produce[i], NULL);printf("count[%d] = %d\n", i, count[i]);}pthread_create(&tid_consume, NULL, consume, NULL);pthread_join(tid_consume, NULL);return 0;}void *produce(void *arg){for(; ;){pthread_mutex_lock(&shared.mutex);if(shared.nput >= MAX_ITEM){pthread_mutex_unlock(&shared.mutex);return (void *)0;}shared.buff[shared.nput] = shared.nval;shared.nput++;shared.nval++;pthread_mutex_unlock(&shared.mutex);*(int *)arg += 1;}}void *consume(void *arg){for(int i=0; i<MAX_ITEM; ++i){if(shared.buff[i] != i)printf("buff[%d] = %d\n", i, shared.buff[i]);}return (void *)0;}
代码二:
#include "../utili.h"#define MAX_ITEM 10000#define MAX_THREAD 5void *produce(void *), *consume(void *);struct {pthread_mutex_t mutex;int buff[MAX_ITEM];int nput;int nval;} shared = {PTHREAD_MUTEX_INITIALIZER};int main(){pthread_t tid_produce[MAX_ITEM], tid_consume;int count[MAX_THREAD];pthread_setconcurrency(MAX_THREAD + 1);for(int i=0; i<MAX_THREAD; ++i){count[i] = 0;pthread_create(&tid_produce[i], NULL, produce, &count[i]);}pthread_create(&tid_consume, NULL, consume, NULL);for(int i=0; i<MAX_THREAD; ++i){pthread_join(tid_produce[i], NULL);printf("count[%d] = %d\n", i, count[i]);}pthread_join(tid_consume, NULL);return 0;}void *produce(void *arg){for(; ;){pthread_mutex_lock(&shared.mutex);if(shared.nput >= MAX_ITEM){pthread_mutex_unlock(&shared.mutex);return (void *)0;}shared.buff[shared.nput] = shared.nval;shared.nput++;shared.nval++;pthread_mutex_unlock(&shared.mutex);*(int *)arg += 1;}}void consume_wait(int i){for(; ;){pthread_mutex_lock(&shared.mutex);if(i < shared.nput){pthread_mutex_unlock(&shared.mutex);return ;}pthread_mutex_unlock(&shared.mutex);}}void *consume(void *arg){for(int i=0; i<MAX_ITEM; ++i){consume_wait(i);if(shared.buff[i] != i)printf("buff[%d] = %d\n", i, shared.buff[i]);}return (void *)0;}
代码三:
#include "../utili.h"#define MAX_ITEM 10000#define MAX_THREAD 5void *produce(void *), *consume(void *);int nitems;int buff[MAX_ITEM];struct {pthread_mutex_t mutex;int nput;int nval;} put = {PTHREAD_MUTEX_INITIALIZER};struct {pthread_mutex_t mutex;pthread_cond_t cond;int nready;} nready = {PTHREAD_MUTEX_INITIALIZER, PTHREAD_COND_INITIALIZER};int main(){pthread_t tid_produce[MAX_ITEM], tid_consume;int count[MAX_THREAD];for(int i=0; i<MAX_THREAD; ++i){count[i] = 0;pthread_create(&tid_produce[i], NULL, produce, &count[i]);}for(int i=0; i<MAX_THREAD; ++i){pthread_join(tid_produce[i], NULL);printf("count[%d] = %d\n", i, count[i]);}pthread_create(&tid_consume, NULL, consume, NULL);pthread_join(tid_consume, NULL);return 0;}void *produce(void *arg){for(; ;){pthread_mutex_lock(&put.mutex);if(put.nput >= MAX_ITEM){pthread_mutex_unlock(&put.mutex);return (void *)0;}buff[put.nput] = put.nval;put.nput++;put.nval++;pthread_mutex_unlock(&put.mutex);pthread_mutex_lock(&nready.mutex);if(nready.nready == 0)pthread_cond_signal(&nready.cond);nready.nready++;pthread_mutex_unlock(&nready.mutex);*(int *)arg += 1;}}void *consume(void *arg){for(int i=0; i<MAX_ITEM; ++i){pthread_mutex_lock(&nready.mutex);while(nready.nready == 0)pthread_cond_wait(&nready.cond, &nready.mutex);nready.nready--;pthread_mutex_unlock(&nready.mutex);if(buff[i] != i)printf("buff[%d] = %d\n", i, buff[i]);}return (void *)0;}
头文件:
#pragma once#include <stdio.h>#include <unistd.h>#include <stdlib.h>#include <math.h>#include <pthread.h>#define min(x, y) ((x) < (y) ? (x) : (y))#define err_exit(m) \do{ \perror(m); \exit(1); \}while(0)
0 0
- 多线程编程之生产者和消费者模型
- java多线程之生产者和消费者模型
- 多线程之生产者消费者模型
- 多线程之生产者消费者模型
- 多线程之生产者消费者模型
- 多线程之生产者消费者模型
- 多线程模型:生产者和消费者
- 【每天一点linux】多线程编程之生产者消费者模型
- 多线程编程之生产者消费者
- IOS 多线程编程_NSLock,NSCondition,synchronized和生产者消费者模型
- Python--多线程编程--生产者消费者模型
- 多线程同步之生产者---消费者模型
- 多线程同步之生产者---消费者模型
- 多线程同步之生产者---消费者模型
- 多线程同步之生产者---消费者模型
- JAVA多线程之生产者消费者模型
- Java多线程之生产者消费者模型
- Java--多线程之生产者消费者模型
- SwipeRefreshLayout 设置下拉刷新的距离高度
- STL源码学习----lower_bound和upper_bound算法
- 读Python获取网络数据的笔记(9月16日)
- JavaScript入门
- 【神经网络与深度学习】Caffe源码中各种依赖库的作用及简单使用
- 多线程编程之生产者和消费者模型
- 文章标题
- 成绩排序
- OpenCV 腐蚀与膨胀+轨迹条控制 综合示例
- 安卓小日记练习(7)回退到主界面和listview的另一个item的点击事件(1)
- 那个男人叫做科比
- 【原创】东方耀reactnative 视频20之-picker组件和箭头函数
- 最大网络流--hdu1532
- IDAE 快键方式