Linux--生产者消费者模型,信号量和条件信号量

生产者和消费者

一个生产者,三个消费者模型,利用

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>

#define PRO 1
#define CON 3

int ready = 0; // 生产的产品编号

pthread_cond_t cond;
pthread_mutex_t mutex;
pthread_t tids[PRO+CON] ;

void *pro(void *arg) {
int id = *(int*)arg;
free(arg);
while ( 1 ) { 
sleep(1);
pthread_mutex_lock(&mutex);
printf("%d生产者线程开始生产产品,产品编号为%d\n", id, ready+1);
ready++;
sleep(rand()%3);
printf("%d生产者线程结束生产产品, 产品编号%d\n", id, ready);
pthread_cond_signal(&cond); // 通知消费者进行消费
pthread_mutex_unlock(&mutex);
sleep(rand()%3);
}
}
void *con(void *arg) {
int id = *(int*)arg;
free(arg);

while ( 1 ) {
pthread_mutex_lock(&mutex);
while ( ready <= 0 ) {
printf("%d消费者线程等待产品\n", id);
pthread_cond_wait(&cond, &mutex);
printf("%d消费者线程等到产品,返回\n", id);
}
printf("%d消费者线程开始消费产品,%d\n",id, ready);
ready--;
sleep(rand()%3);
printf("%d消费者线程消费完毕,%d\n", id, ready+1);
pthread_mutex_unlock(&mutex);
sleep(rand()%2);
}
}

int main( void ) {
int i;

srand(getpid());
pthread_cond_init(&cond, NULL);
pthread_mutex_init(&mutex, NULL);
for (i=0; i<PRO; i++) {
int *p = malloc(sizeof(int));
*p = i;
pthread_create(&tids[i], NULL, pro, (void*)p);
}
for (i=0; i<CON; i++) {
int *p = malloc(sizeof(int));
*p = i;
pthread_create(&tids[PRO+i], NULL, con, (void*)p);
}

for (i=0; i<PRO+CON; i++) {
pthread_join(tids[i], NULL);
}

pthread_mutex_destroy(&mutex);
pthread_cond_destroy(&cond);
}


热门文章

编程学习 ·

2020上半年为你留下了什么?

今天是2020年6月30号,2020年上半年的最后一天.蓦然回首,发现时光过得飞快,记忆中那憋在家里,数着日子,焦虑不安的情景还历历在目.那时候最大的愿望就是像电视中那样:一觉醒来,半年过去了,大家又都按部就班没羞没躁的生活着.好多文人墨客都会鼓吹:每种经历都是人生的财富,人生没…
编程学习 ·

如何解决eclipse无法显示svn资源库以及给资源库设置起别名

前言每次安排项目时领导都会丢给我一个svn地址,让我去download下来然后功能写完了提交到svn即可。可是项目做多了话,就会出现在很多个svn地址,同时由于url里面的中文会被转码,所有在导入的时候根本不知道哪个时自己要导入的。如下面所示:显示svn资源库以及设置别名 从下图…
编程学习 ·

自增自减及逗号表达式

** 自增自减及逗号表达式 **一.自增、自减运算符1.自增运算符++和自减运算符–都是单目运算符,功能是使变量的值加1或减1。 2.自加或自减只能用于变量,而不能用于常量或表达式。 3.用于++、–运算的变量只能是整型、字符型和指针型变量运行下面的程序,观察并分析运算规则#in…
编程学习 ·

UE4中让某个UI位于窗口的最顶端

1.处于同一嵌套层级的UI 可以使用Set ZOrder 设置那个Widget位于屏幕的最前面2.创建一个user widget 叫做ui_umg,里面加上两个按钮3.创建另外一个widget 叫做ui_pic,里面加上一个image4.这步是重点,ui_umg中按钮点击的时候 使用create widget 生成一个ui_pic, 但是这个时…
编程学习 ·

Spring学习笔记(一):工厂模式

Spring学习笔记一:工厂模式1.简介2.工厂模式简单工厂设计通⽤⼯⼚的设计通用工厂的使用方式 1.简介 1.Spring是⼀个轻量级的 JavaEE 解决⽅案,整合众多优秀的设计模式。 2.EJB(Enterprise Java Bean):重量级框架,存在问题包括:运行环境苛刻,代码移植性差。 什么是轻量级?…
编程学习 ·

NC6 基于元数据的持久化服务接口实现类

基于元数据的持久化服务接口实现类: package nc.md.persist.framework.imp;import java.util.Collection;import nc.md.data.access.NCObject; import nc.md.data.criterion.QueryCondition; import nc.md.model.MetaDataException; import nc.md.persist.framework.IMDPersis…
编程学习 ·

Spark1.x升级Spark2.x常见异常Kafka篇【TopicMetadataRequest】

一.原因分析 当Spark从1.x升级到2.x时,如果使用SparkStreaming加载Kafka的数据,即使Kafka版本没有变化【一般会有所升级】,对应的spark-streaming-kafka也必须升级到对应版本,访问方式也会有所变化。 此处是从Spark1.6.0升级到Spark2.4.3,Kafka略有升级【从2.1.0升级到2.2…
编程学习 ·

小程序学习之路五:scroll-view实现多列布局

上面讲解了一些部分简单功能,接下来讲讲scroll-view的进阶,实现多列布局,先上效果:首先来看看布局文件<scroll-view class="scroll"><view class="item" wx:for={{datas}} wx:key=index wx:for-item="item" data-item="{{item…
编程学习 ·

2020-07_python-docx 0.8.10 User Guide_10

python-docx 0.8.10 User Guide 说明:本文的内容来源python-docx官方文档,出于学习的目的借助于有道进行翻译。 翻译的原则:只有在有道翻译出的内容不通顺或意义有误的情况下才使用个人翻译。Understanding pictures and other shapes Conceptually, Word documents have tw…
编程学习 ·

mysql表碎片回收

1、alter table t engine = innodb;重建整个表,对于支持online ddl的版本,当线上进行操作的时候要调大innodb_online_alter_log_max_size参数,因为该参数会记录ddl过程中的dml操作,而此临时文件存放在临时排序区(innodb_sort_buffer_size),innodb_sort_buffer_size参数上…
编程学习 ·

HDFS架构

五.HDFS架构大多数分布式大数据框架都是主从架构HDFS也是主从架构Master|Slave或称为管理节点|工作节点主叫NameNode,中文称“名称节点”从叫DataNode,中文称“数据节点”5.1 NameNode5.1.1 文件系统file system文件系统:操作系统中负责管理文件、存储文件信息的软件具体地说…
编程学习 ·

创新实践记录一

使用UGUI制作开始界面 一、UGUI概述 1.1常用组件 UGUI是从Unity4.6开始被集成到Unity编译器中的官方UI系统,具有灵活,快速和可视化兼容性好的特点。以下为常用的UGUI控件:1.2创建UGUI控件 创建UI控件时,如果没有Canvas和EventSystem系统会自动创建。Canvas画布,是所有UI控…
编程学习 ·

TomCat学习笔记(1)--裸Tomcat框架实现和IDEA实现的比较

TomCat是什么不多说了,这里是用来记录我学习TomCat的操作与心路历程 本文对比演示用纯Tomcat和用IDEA集成开发同样的页面效果的两种方法。 在不用IDEA集成开发环境时稍微学习了一些tomcat,能写出一个界面并且用get、post函数试着传递数据。(在下文介绍一下流程并给予简单分析…
编程学习 ·

JAVA学习之路(3) request的总结

文章目录引言Request对请求行数据的操作Request对请求头数据的操作Request对请求头数据的操作通用方式中文乱码问题请求转发 引言 在httpServlet类中,我们只需要调用doGet和doPost方法即可以实现对应的功能。对应这两个方法,有两个穿进去的参数对象,一个是response,一个是r…
编程学习 ·

ssm框架下简单的增删改查实现

ssm框架下简单的增删改查实现 代码太多就不逐一展示了,到目前为止这几个类之间的关系还是有点不太清楚。 package controller;import bean.User; import dao.UserDao; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype…
编程学习 ·

POJ1270 Following Orders(拓扑排序+dfs回溯)

POJ1270 Following Orders(拓扑排序+dfs回溯) Description Order is an important concept in mathematics and in computer science. For example, Zorn’s Lemma states: ``a partially ordered set in which every chain has an upper bound contains a maximal element.’…
编程学习 ·

想进大厂?字节跳动等独角兽公司都在重金招聘Python工程师!(Python就是第一语言!)

在本文章中,作者通过自身经历,力求客观的谈谈个人选择学习Python的动机,以及独角兽公司对Python工程师的要求及薪资。 从目前各种迹象(企业招聘,语言排名等)看来Python相对Java应该是暂时领先,这得力于Python的厚积薄发。 01选择Python不只是选择一门语言 你能收获并不仅…
编程学习 ·

通过2020年阿里云云计算ACE认证总结附真题笔记

一、考前准备 1.1 近期刚刚通过阿里云ACE考试,做一下笔记和心得。 1.自己预留一个月时间复习,去官网报名,官网地址就不用发了吧。 2.考试每一道题库都是很精心的题目,需要你考虑很周到,细节,亚注意细节,比如题目基本都是你自己身为架构师,怎么解决企业架构的问题同时还…
编程学习 ·

阿里云CentOS8安装nginx+php-fpm

附加知识 CentOS8已经开始使用dnf作为系统包的安装工具了,yum虽然可以用,但是已经不推荐了 安装nginx 阿里CentOS8安装的是nginx 1.14.1,感觉上还是想升级一下,参考CentOS 8升级nginx至最新版本(yum方式) 安装php-fpm 阿里CentOS8安装的是php7.2,可以用dnf升级一下,参考H…