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

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

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);
}

实验现象


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

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/zaji/4751765.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2022-11-08
下一篇2022-11-08

发表评论

登录后才能评论

评论列表(0条)

    保存