生产者消费者问题

这是一个非常经典的多线程题目,题目大意如下:有一个生产者在生产产品,这些产品将提供给若干个消费者去消费,为了使生产者和消费者能并发执行,在两者之间设置一个有多个缓冲区的缓冲池,生产者将它生产的产品放入一个缓冲区中,消费者可以从缓冲区中取走产品进行消费,所有生产者和消费者都是异步方式运行的,但它们必须保持同步,即不允许消费者到一个空的缓冲区中取产品,也不允许生产者向一个已经装满产品且尚未被取走的缓冲区中投放产品。

/*****************************************************
copyright (C), 2014-2015, Lighting Studio. Co.,     Ltd.
File name锛?Author锛欽erey_Jobs    Version:0.1    Date:
Description锛?Funcion List:
*****************************************************/#include <stdio.h>
#include <pthread.h>#define BUFFER_SIZE 16struct prodcons
{int buffer[BUFFER_SIZE];pthread_mutex_t lock;int readpos,writepos;pthread_cond_t notempty;pthread_cond_t notfull;
};void init(struct prodcons *b)
{pthread_mutex_init(&b->lock,NULL);pthread_cond_init(&b->notempty,NULL);pthread_cond_init(&b->notfull,NULL);b->readpos = 0;b->writepos = 0;
}void put(struct prodcons *b,int data)
{pthread_mutex_lock(&b->lock);if((b->writepos + 1) % BUFFER_SIZE == b->readpos){pthread_cond_wait(&b->notfull,&b->lock);}b->buffer[b->writepos] = data;b->writepos++;if(b->writepos >= BUFFER_SIZE){b->writepos = 0;}pthread_cond_signal(&b->notempty);pthread_mutex_unlock(&b->lock);
}int get(struct prodcons *b)
{int data;pthread_mutex_lock(&b->lock);if(b->writepos == b->readpos){pthread_cond_wait(&b->notempty,&b->lock);}data = b->buffer[b->readpos];b->readpos++;if(b->readpos >= BUFFER_SIZE){b->readpos = 0;}pthread_cond_signal(&b->notfull);pthread_mutex_unlock(&b->lock);return data;
}#define OVER -1struct prodcons buffer;void * producer(void *data)
{int n;for(n = 0;n < 20;n++){printf("%d----->\n",n);put(&buffer,n);}put(&buffer,OVER);return NULL;
}void * consumer(void *data)
{int d;while(1){d = get(&buffer);if(d == OVER)break;printf("----->%d\n",d);}return NULL;
}int main()
{pthread_t th_a,th_b;void *retval;init(&buffer);pthread_create(&th_a,NULL,producer,0);pthread_create(&th_b,NULL,consumer,0);pthread_join(th_a,&retval);pthread_join(th_b,&retval);return 0;
}

线程编程——经典案例相关推荐

  1. Python编程经典案例【考题】自由落体运动球的运动轨迹

    本文和你一起探索Python编程经典案例,让你沉浸式学习Python.助你期末考试拿高分,拿到大厂的心仪offer.你可以先自己拿着题目去思考有多少种不同的解题方法,然后再对照本文解题方法进行比较.有 ...

  2. Visual C++网络编程经典案例详解 第9章 实用播放器 数据读取与播放控制 识别数据文件信息

    识别数据文件信息主要是指对mp3数据格式识别 定义顺序代码如下 typedef struct mp3_struct //自定义mp3结构体 {char heade[3]; //tag字符标记char ...

  3. Python编程经典案例【考题】求某个范围内能被3整除且能被5整除的所有数,及这些数的和

    本文和你一起探索Python编程经典案例,让你沉浸式学习Python.你可以拿着题目先思考,然后再对照本文解题方法进行比较.有不同的见解欢迎到公众号中跟我一起探讨.    文章目录 一.经典案例[考题 ...

  4. Python编程经典案例【考题】排列组合

    本文和你一起探索Python编程经典案例,让你沉浸式学习Python.你可以拿着题目先思考,然后再对照本文解题方法进行比较.有不同的见解欢迎到公众号中跟我一起探讨. 文章目录 一.经典案例[考题] 二 ...

  5. 让你彻底弄懂Python编程经典案例【考题】之反转一个值

    学习Python有很多不同的方法,可以看视频.看博客.看公众号等.但光说不练,很难有快速的提升.最好能动手去处理实际问题,这样才能把学到的知识应用得更熟练.    本文和你一起来探索Python编程的 ...

  6. Python编程经典案例【考题】公司奖金发放

    本文和你一起探索Python编程经典案例,让你沉浸式学习Python.你可以拿着题目先思考,然后再对照本文解题方法进行比较.有不同的见解欢迎到公众号中跟我一起探讨.    文章目录 一.经典案例[考题 ...

  7. Visual C++网络编程经典案例详解 第9章 实用播放器 多线程通信 线程间通信 根据播放列表音乐序号判断mp3播放顺序

    根据播放列表音乐序号判断mp3播放顺序 定义一个整形变量index int index=0; 在列表控件双击消息处理函数OnDblclkList2()中 将列表选择项的索引赋值给index void ...

  8. python编程经典案例-一个非常适合Python新手的编程案例——投票小程序

    想快速入门Python,实战才是捷径. 前面给大家介绍了新手学习Python最重要的一点,就是多动手,多练习,在实战中才能快速进阶.那么通常一个好的实战案例是会让大家的学习事半功倍的.假如你现在刚刚学 ...

  9. 线程安全问题经典案例---卖票

      在入门多线程的时候,看到过不少的案例,其中卖票案例尤为经典,在这里自己也记录一下,同时加深对于线程安全的理解: 案例场景 情景一:    现在有一个电影院,马上要上映电影<战狼5>,电 ...

最新文章

  1. python读取csv文件的方法-python读取csv文件指定行的2种方法详解
  2. springboot静态网页放哪里_STEP4.1 第一个SpringBoot项目
  3. CLR Via C# 3rd 阅读摘要 -- Chapter 28 – Primitive Thread Synchronization Constructs
  4. linux – 我怎么知道我到somaxconn有多近?
  5. 冒泡、选择、插入排序算法
  6. 【Eclipse】Java Compiler没有Annotaion Processing, 需要安装Eclipse Java Development Tools
  7. Python面试题之装饰器漫谈
  8. Picocli 2.0:类固醇上的Groovy脚本
  9. IDEA 正式版终于支持中文版和 JDK 直接下载了(太方便了)附介绍视频
  10. 强化学习DQN算法实战之CartPole
  11. java转动的风扇课程设计,课程设计—智能风扇设计报告
  12. android开发学习---开发一个简易的短信发送器
  13. NYOJ517 最小公倍数
  14. MapGIS云认证失败
  15. 详细解读TPH-YOLOv5 | 让目标检测任务中的小目标无处遁形
  16. LivePlayer H5播放器、在react中使用
  17. adb shell循环命令_Android ADB命令详解
  18. git apply 打补丁
  19. Kafka架构篇 - 多副本机制
  20. 云计算技术 — 分布式云

热门文章

  1. java escpos_如何在Linux中将ESC / POS命令发送到热敏打印机
  2. π=4*atan(1.0);
  3. 一文搞懂0.1UF和10UF电容并联使用技巧
  4. 手把手转行|小步试错,逐步迭代
  5. 职场:大学生情侣搭档求职难
  6. 我的十几年技术总结(一):从疯狂到无奈
  7. 本周比赛一些感想(5.25~5.31)
  8. 基于逻辑回归的讽刺文本检测
  9. 亚信大数据平台产品经理 杨晋:大数据是怎么应用于技术方面的
  10. STATA学习笔记:数据合并