信号量实现生产者消费者问题

本文介绍了生产者/消费者问题的基本概念及其解决方案。通过信号量控制对共享资源的访问,确保了生产者和消费者之间的同步。文章详细解释了信号量的工作原理,包括原子操作、临界区的概念,并给出了具体的伪代码示例。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

生产者/消费者问题是一个多进程进行同步的问题,需要使用信号量(semaphore)进行相关资源的控制,实现并发。一些关于并发的基础概念如下:
原子操作 一组不可分割的函数或操作。这类函数或操作的执行是不可以被中断的。
临界区 进程中一段需要访问共享资源的代码,共享资源一次只能允许一个进程访问,系统要保证进入临界区的进程不超过一个。 正常执行可以并行,临界区代码执行只能串行。
在这里插入图片描述

解决并发问题的核心:控制对共享资源的访问

信号量(semaphore)
用于在进程间发送信号的整形变量,该变量定义3个原子操作:

1.初始化:信号量的初始值为非负整数
2.semSignal(V):将信号量加1,如果之后信号量的值大于等于零,进程唤醒该信号量上等待的一个进程,并继续自己的执行。
3.semWait(P):将信号量减1,如果之后信号量的值为负数,调用semWait的函数将阻塞,否则进程继续执行。

互斥锁和01信号量的区别:互斥锁执行上锁和开锁的进程必须为同一进程,01信号灯可以是不同进程。

生产者/消费者问题
有一个或多个生产者,不停生产数据,将所生产的数据放到一个缓冲区中。同时有一个消费者将数据从缓冲区中取出。用信号量解决该问方法伪代码如下:

semaphore full = 0;
semaphore empty = BUFFER_SIZE;
semaphore mutex = 1Producer() 			Consumer() 
{					{
	produce();			P(full);
	P(empty);			P(mutex);
	P(mutex);			take();
	put();				V(mutex);
	V(mutex);			V(empty);
	V(full);			consume();
}					}

生产者:生产物品 -> 请求访问缓冲区空闲的资源 (没有资源阻塞,有资源继续执行) -> 给缓冲区上锁 -> 向缓冲区添加物品 -> 给缓冲区解锁 -> 释放可用面包资源

消费者:请求访问可用物品资源(没有资源阻塞,有资源继续执行)-> 给缓冲区上锁 -> 从缓冲区拿走物品 -> 给缓冲区解锁 -> 释放可用缓冲区资源 -> 消费物品

对信号量的理解 信号量的PV操作实际上是某个进程使用和释放某资源,如果进程想要使用资源,当前资源为0那么进程就会阻塞等待资源。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值