Linux-信号量互斥

这篇博客探讨了如何使用Linux信号量实现消费者生产者问题的互斥。通过创建两个线程,一个代表生产者,另一个代表消费者,利用信号量`mutex`、`empty`和`full`来确保对缓冲区的互斥访问和资源同步。通过调整线程延时,模拟不同速度的生产和消费,加深了对多线程和信号量机制的理解。
摘要由CSDN通过智能技术生成

Linux-信号量互斥

1. 消费者生产者问题

通过创建两个线程,一个代表生产者,另一个代表消费者,申请一段固定大小的内存区域表示缓冲区,向缓冲区末尾插入字符和取出字符来模拟生产消费的过程,

其中生产过程是随机生产一个小写字母放入缓冲区中,而且用nextin,nextout表示下一个要插入以及要取出的下标位置,方便下一次操作。

​ 为了保证消费者线程在插入字符时,不被生产者线程堵塞,应该通过信号量机制防止此情况发生,设置三个信号量

  • mutex::初始值为1,该信号量作用为控制一次只有一个线程可以访问缓冲区,保证消费过程和生产过程始终互斥。

  • empyt:初始值为缓冲区大小,每生产一次该信号量就减1,每消费一次该信号量就加1,当缓冲区已满时,该信号量会减小到0,这样在生产者线程开头的

    sem_wait(&empty)就会堵塞生产过程,保证缓冲区已满时不再进行生产。

  • full:初始值为0,每消费一次该信号量就减1,每生产一次该信号量就加1,当缓冲区为空时,在消费者线程开头的sem_wait(&full)就会堵塞消费过程,保证缓冲区为空时不再进行消费。

2.代码如下:

#include <unistd.h>
#include <semaphore.h>
#include <stdio.h>
#include <pthread.h>
#include <stdlib.h>
#define N 10
char buff[N];
int count, nextin, nextout;
sem_t mutex;
sem_t empty;
sem_t full;
int speed_producer = 1, speed_consumer = 4;

void init() {
   
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值