栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

Linux C系统编程——使用信号量实现生产者,消费者问题(两分钟搞明白)

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

Linux C系统编程——使用信号量实现生产者,消费者问题(两分钟搞明白)

信号量和信号不是同一个东西。

信号量 :指的是semaphore,相当于设置初始值为N的互斥量,
N就表示同时访问的线程数(针对的是线程同步问题)
信号:指的是用来实现进程与进程之间,进程与线程之间的一种异步机制。(针对的是异步处理的问题)

实验源码

下面展示一些 内联代码片。

重在理解思路
#include 
#include 
#include 
#include 
#include 

#define NUM 5
int queue[NUM];

sem_t sem_blank,sem_food;//空盘子,包子
void producer(){
    int i=0;
    while (1){
        sem_wait(&sem_blank);
        queue[i]=rand()%100+1;
        sem_post(&sem_food);
        printf("producer queue[%d] is : %dn",i,queue[i]);
        i++;
        i=i%5;
        sleep(rand()%3);
    }
}
void consumer(){
    int i=0;
    while (1){
        sem_wait(&sem_food);
        printf("consumer queue[%d] is %dn",i,queue[i]);
        queue[i]=0;
        sem_post(&sem_blank);
        i++;
        i=i%5;
        sleep(rand()%3);
    }
}
int main(void){
    //建立一个信号量
    int ret;
    ret=sem_init(&sem_blank,0,5);//value值就表示桌子上有几个盘子
    if (ret==-1){
        perror("[sem_blank]");
        return -1;
    }
    ret=sem_init(&sem_food,0,0);//value值表示桌子上有几个包子
    if (ret==-1){
        perror("[sem_food]");
        return -1;
    }

    //创建两个线程,生产者,消费者
    pthread_t tid1,tid2;
    while ((pthread_create(&tid1,NULL,(void *)producer,NULL))!=0);
    while ((pthread_create(&tid2,NULL,(void *)consumer,NULL))!=0);

    //回收线程
    pthread_join(tid1,NULL);
    pthread_join(tid2,NULL);
}

实验现象


最好根据实现现象分析代码,分析你得到的结论

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/347306.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号