LINUX网络编程信号量生产者消费者模型(带现象)如果大家在学习中有什么疑惑可以留言给我,理应知无不言言无不尽

3 篇文章 0 订阅
#include <stdio.h>
#include <pthread.h>
#include <semaphore.h>
#include <stdlib.h>
#include <unistd.h>

#define NUM 5

sem_t product_number,blank_number;//定义两个信号量,生产物品数量和剩余可生产产品空间数
int queue[NUM];//定义一个队列(模拟生产出来装物品的容器,亦是消费者消费的物品的容器)

void* product_func(void* arg)//生产者回调函数
{
    int i=0;//定义一个数组下标
    while(1)
    {  
        sem_wait(&blank_number);//将可生产产品空间数减1,若为0则阻塞等待
        queue[i]=rand() %100 +1;//模拟生产产品出来
        sem_post(&product_number);//将生产的产品放入容器,生产数量+1
        printf("生产了一个产品放%d号格子\n",i);
        i = (i+1)%NUM;//将数组下标+1,到5就循环
        sleep(rand()%3);
    }

}

void* customer_func(void* arg)
{
    int i = 0 ;
    while(1)
    {
        sem_wait(&product_number);//判断有没有产品,有就-1,没有就阻塞等待
        printf("消费掉的产品为%d\n",i);
        queue[i]=0;//消费了后将对应队列元素清空
        sem_post(&blank_number);//空格子数+1
        i = (i+1)%NUM;
        sleep(rand()%3);
    }
}

int main(void)
{
    pthread_t pid,cid;

    sem_init(&product_number,0,0);//初始化产品信号量
    sem_init(&blank_number,0,5);//初始化空格子数信号量

    pthread_create(&pid,NULL,product_func,NULL);//创建生产者
    pthread_create(&cid,NULL,customer_func,NULL);//创建消费者

    pthread_join(pid,NULL);//阻塞等待线程返回
    pthread_join(cid,NULL);

    sem_destroy(&product_number);//销毁信号量
    sem_destroy(&blank_number);

    return 0;
}

生产了一个产品放0号格子
消费掉的产品为0
生产了一个产品放1号格子
消费掉的产品为1
生产了一个产品放2号格子
消费掉的产品为2
生产了一个产品放3号格子
消费掉的产品为3
生产了一个产品放4号格子
消费掉的产品为4
生产了一个产品放0号格子
生产了一个产品放1号格子
消费掉的产品为0
生产了一个产品放2号格子
消费掉的产品为1
消费掉的产品为2
生产了一个产品放3号格子
消费掉的产品为3
生产了一个产品放4号格子
消费掉的产品为4
生产了一个产品放0号格子
消费掉的产品为0
生产了一个产品放1号格子
消费掉的产品为1
生产了一个产品放2号格子
消费掉的产品为2
生产了一个产品放3号格子
消费掉的产品为3
生产了一个产品放4号格子
消费掉的产品为4
生产了一个产品放0号格子
消费掉的产品为0
生产了一个产品放1号格子
消费掉的产品为1
生产了一个产品放2号格子
生产了一个产品放3号格子
消费掉的产品为2
消费掉的产品为3
生产了一个产品放4号格子
消费掉的产品为4
生产了一个产品放0号格子
生产了一个产品放1号格子
生产了一个产品放2号格子
消费掉的产品为0
消费掉的产品为1
生产了一个产品放3号格子
消费掉的产品为2
消费掉的产品为3
生产了一个产品放4号格子
消费掉的产品为4
生产了一个产品放0号格子
消费掉的产品为0
生产了一个产品放1号格子

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值