多线程编程之生产者和消费者模型

来源:互联网 发布:华为系统源码是什么 编辑:程序博客网 时间: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
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 燃气热水器温度调节拧不动怎么办 能率热水器震动声大怎么办 车底盘磕了漏油怎么办 法士特变速箱的随动阀漏气了怎么办 大灯随动afs失灵怎么办 2017款迈腾大灯随动故障怎么办 微信gps信号不好怎么办 苹果6s定位不准怎么办 电脑不读取u盘怎么办 注塑机上的料烤坨了怎么办 智能锁电机坏了怎么办 注塑机加热嘴内扣突了怎么办 tpu粘在螺杆上怎么办 注塑机锁模时会有射退动作怎么办 电动车刹车油泵不打油怎么办 cad转pdf颜色浅怎么办 松下多功能传真一体机卡纸怎么办 无刷电机坏了怎么办 6kv高压电机绝缘不合格怎么办? 400t油压机下降太慢怎么办 无法连线到服务器1~1怎么办? 数控车床车角度不亮怎么办 超市存包柜的票不见了怎么办 交货期来不及导致船期延误怎么办 跑1000米中途累怎么办 手指被机器压烂怎么办 机械手不能回归原点该怎么办 前缘送纸纸板翘怎么办 三菱AL 1R.2报警怎么办 工作好但领导不好伺候怎么办 孕妇憋尿憋的小腹疼怎么办 怀孕憋尿憋的小腹疼怎么办 半夜憋尿憋的小腹疼怎么办 新生儿大便次数较多怎么办 母猎生下三天没有奶怎么办 孩孑大便干不爱喝水怎么办 发那科1050报警怎么办 plc模块bf亮了怎么办 plc模块df亮了怎么办 西门子触摸屏进不了主画面怎么办 pos机显示白屏怎么办