#include<stdio.h>
#include<stdlib.h>
#include<semaphore.h>
#include<pthread.h>
#include<unistd.h> #define NumOf_Producer 5 //the max num of producer
#define NumOf_Consumer 10 //the max num of consumer
#define Maxnum 10 // the max num of product
sem_t Empty_sem; //the goal of whether the num of product is null
sem_t Full_sem; //the goal of whether the num of product is equal to Maxnum pthread_mutex_t Mutex; //the goal of whether someone use the buff int Producer_id = ;
int Consumer_id = ;
int NowNumOfProduce = ;
void *Producer(void *arg) //the thread of producer
{
int id = Producer_id++;
while()
{
sleep(0.1);
sem_wait(&Full_sem); //when it comes to zero ,it means that the num of product is equal to Maxnum
pthread_mutex_lock(&Mutex); //lock the buff
NowNumOfProduce++;
printf("Producerthread %d product one,the num is:%d \n",id%NumOf_Producer,NowNumOfProduce);
pthread_mutex_unlock(&Mutex);
sem_post(&Empty_sem); //when it comes to ten ,it means there are ten products can be used by consumer
} return ((void *));
} void *Consumer(void *arg)
{
int id = Consumer_id++;
while()
{
sleep(0.2);
sem_wait(&Empty_sem);
pthread_mutex_lock(&Mutex);
NowNumOfProduce--;
printf("Consumerthread %d use product one,the num is:%d \n",id%NumOf_Consumer,NowNumOfProduce);
pthread_mutex_unlock(&Mutex);
sem_post(&Full_sem);
}
return ((void *));
} int main()
{
pthread_t Con[NumOf_Consumer];
pthread_t Pro[NumOf_Producer]; int temp1 = sem_init(&Empty_sem,,);
int temp2 = sem_init(&Full_sem,,Maxnum);
if(temp1&&temp2!=)
{
printf("sem init failed \n");
exit();
} int temp3 = pthread_mutex_init(&Mutex,NULL); if(temp3!=)
{
printf("Mutex init failed \n");
exit();
} for(int i= ;i<NumOf_Producer;i++)
{
int temp4 = pthread_create(&Pro[i],NULL,Producer,(void *)&i);
if(temp4!=)
{
printf("thread create failed !\n");
exit();
}
} for(int i=;i<NumOf_Consumer;i++)
{
int temp5 = pthread_create(&Con[i],NULL,Consumer,(void *)&i);
if(temp5!=)
{
printf("thread create failed !\n");
}
exit();
}
//destroy the thread
for(int i=;i<NumOf_Consumer;i++)
{
pthread_join(Con[i],NULL);
} for(int i=;i<NumOf_Producer;i++)
{
pthread_join(Pro[i],NULL);
} return ;
}
说明:unisted.h是用来调用sleep,pthread.h是linux系统下线程编程的库,semaphore.h是使用信号灯的函数库,至于那些初始化方法,wait方法,post等可以去查查的。如果在编译程序时候出现类似sem_t未定义等问题,需要设置一下link链接,找到linux系统下安装的lib库中的libpthread.so导入进去就好了。

C语言调用库函数实现生产者消费者问题的更多相关文章

  1. Go语言协程并发---生产者消费者实例

    package main import ( "fmt" "strconv" "time" ) /* 改进生产者消费者模型 ·生产者每秒生产一 ...

  2. python自动化--语言基础线程、生产者消费者示例

    进程与线程的区别:进程不共享空间,线程共享地址空间 线程共享空间优缺点:优点:多线程给用户的体验好些,打开时占用的内存比进程少缺点:共享地址空间会相互干扰,甚至有影响 import threading ...

  3. go语言实现生产者-消费者

    前言: 之前在学习操作系统的时候,就知道生产者-消费者,但是概念是模模糊糊的,好像是一直没搞明白. 其实很简单嘛,生产者生产,消费者进行消费,就是如此简单.了解了一下go语言的goroute,感觉实现 ...

  4. 通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制

    通过调用C语言的库函数与在C代码中使用内联汇编两种方式来使用同一个系统调用来分析系统调用的工作机制 前言说明 本篇为网易云课堂Linux内核分析课程的第四周作业,我将通过调用C语言的库函数与在C代码中 ...

  5. 并发、并行、同步、异步、全局解释锁GIL、同步锁Lock、死锁、递归锁、同步对象/条件、信号量、队列、生产者消费者、多进程模块、进程的调用、Process类、

    并发:是指系统具有处理多个任务/动作的能力. 并行:是指系统具有同时处理多个任务/动作的能力. 并行是并发的子集. 同步:当进程执行到一个IO(等待外部数据)的时候. 异步:当进程执行到一个IO不等到 ...

  6. Scala调用Kafka的生产者和消费者Demo,以及一些配置参数整理

    kafka简介 Kafka是apache开源的一款用Scala编写的消息队列中间件,具有高吞吐量,低延时等特性. Kafka对消息保存时根据Topic进行归类,发送消息者称为Producer,消息接受 ...

  7. 生产者消费者问题c语言实现

    #include <stdio.h> #include <process.h> #include <Windows.h> //信号量与关键段 CRITICAL_SE ...

  8. Linux线程编程之生产者消费者问题

    前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注意的事项.文中涉及的代码运行环境如下: 本文假定读者已具备线程同步的基础知识. 一  顺序表循环队列 1.1 ...

  9. Linux线程编程之生产者消费者问题【转】

    转自:http://www.cnblogs.com/clover-toeic/p/4029269.html 前言 本文基于顺序循环队列,给出Linux生产者/消费者问题的多线程示例,并讨论编程时需要注 ...

随机推荐

  1. Hdu3072-Intelligence System(强连通求最小值)

    After a day, ALPCs finally complete their ultimate intelligence system, the purpose of it is of cour ...

  2. pyqt columnView例子学习

    # -*- coding: utf-8 -*- # python:2.x __author__ = 'Administrator' from PyQt4.QtGui import  * from Py ...

  3. 一段代码说明javascript闭包执行机制

    假设你能理解以下代码的执行结果,应该就算理解闭包的执行机制了. var name = "tom"; var myobj = { name: "jackson", ...

  4. 显示器 RUIGE瑞鸽高清显示器TL-S1700HD

    版权声明:本文博客琅邪工作室原创文章,博客,未经同意不得转载.

  5. [springmvc+mybatis][关于这两个框架的学习,我想说]

    关于学习笔记 在对java web有了一定的了解后,这两个框架没怎么写学习笔记了…毕竟项目驱动型…… 关于学习资料 强烈推荐传智播客的燕青讲解的 让我对这种培训班教育的资料刮目相看(不过还是千万别去这 ...

  6. [HeadFirst-HTMLCSS学习笔记][第六章严格的HTML]

    远古 古老的html 4.01和XHTML 1.1 页面 必须用Doctype挑明,再html元素上面 html 4.01 <!DOCTYPE html PUBLIC "-//W3C/ ...

  7. 细讲encodeURI和encodeURIComponent以及escape的区别与应用

    首先,我们都知道这三个东西都是用来编码的 先来说encodeURI()和encodeURIComponent() 这两个是在转换url时候用来编码解码用的. 有编码就会有解码, 解码就是decodeU ...

  8. 父元素高度为auto,子元素使用top:-50%没有效果的问题

    无意间在实现元素垂直居中的一种方式测试到,当一个元素高度没有指定的情况下,其 postion:relative;top:-50%;无效 后来查阅w3c看到这样一句话: <percentage&g ...

  9. asp.net页面按Enter键IE不提交表单

    //当按下回车键时,让指定的按钮获取指定的文本框的事件                this.txtFNick.Attributes.Add("onkeydown", " ...

  10. C# 4.0 并行计算部分

    C# 4.0 并行计算部分   c#linq算法多线程list微软   目录(?)[-] C 40 并行计算部分 一简单使用 二 并行循环的中断和跳出 三并行循环中为数组集合添加项 四返回集合运算结果 ...