生产者消费者问题是一个并发程序之间同步的一个经典案例。问题背景如下:
有一个仓库(缓冲区),生产者生产出来的东西往里面扔,消费者从里面取东西。如何安排能够使两者之间不冲突。
一些基本的约束条件:
1.仓库只有一个,且有固定大小。生产者有多个消费者有多个
2.生产者占用仓库前要判断仓库是否满,满了就不能争用
3.消费者使用仓库前要判断仓库是否空,空了就不能争用
4.仓库中要么只有消费者要么只有生产者
PV原语伪代码如下(假定仓库一开始空的):没有死锁用的是AND信号量解决的,伪代码为:
生产者
P(仓库满)
P(生产者消费者互斥)
生产
V(生产者消费者互斥)
V(仓库空)
消费者
P(仓库空)
P(生产者消费者互斥)
消费
V(生产者消费者互斥)
V(仓库满)
在代码中,共享内存就是仓库,使用信号量来完成PV原语操作。同时在逻辑上将共享内存描述为环形的先进先出(FIFO)管道。来实现生产者和消费者之间的同步。
其它:
一个PV操作一般就用一个信号量来实现。
一个信号量可以有多个成员也就是说一个信号量可以等待多个资源满足条件,而不是加个信号量进行互斥。(关于这个在使用信号量解决哲学家就餐问题中有体现,哲学家要等待2个筷子都可用并不是要使用两个信号量来实现,本身该问题需要用到的PV操作也就只有一个)
实现一个shmfifo
//头部信息
struct shmhead
{
uint32_t blksize; //块大小
uint32_t blocks; //总块数
uint32_t rd_index; //读索引 ,当期缓冲区的状态
uint32_t wr_index; //写索引
};
//管道基本结构信息
struct shmfifo
{
shmhead_t *p_shm; //指向共享内存头部指针
char *p_payload; //有效负载起始地址
int shmid; //共享内存id
int sem_mutex; //生产者消费者用来占用仓库的信号量
int sem_full; //仓库已满的信号量
int sem_empty; //仓库已空的信号量
};
int in=0,out=0;
item buffer[n];
semaphore mutex=1,empty=n,full=0;
void proceducer()
{
do{
producer an item nextp;
wait(empty);
wait(mutex);
buffer[in]=nextp;
in:=(in+1)%n;
signal(mutex);
signal(full);
}while(TRUE)
}
void consumer()
{
do{
wait(full);
wait(mutex);
nextc = buffer[out];
out = (out+1)%n;
signal(mutex);
signal(empty);
consumer the item in nextc;
}while(TRUE)
}
void main()
{
cobdgin
proceducer();
consumer();
coend
}
没有合适的资源?快使用搜索试试~ 我知道了~
System V共享内存与信号量综合应用之生产者与消费者问题解决
5星 · 超过95%的资源 需积分: 32 72 下载量 41 浏览量
2015-05-27
00:34:05
上传
评论 2
收藏 5KB GZ 举报
温馨提示
共9个文件
c:5个
h:2个
makefile:1个
用System V共享内存与信号量综合应用之生产者与消费者问题解决的相关代码,几乎每句代码都有注释,方便阅读.
资源推荐
资源详情
资源评论
收起资源包目录
System V共享内存与信号量综合应用之生产者与消费者问题解决.tar.gz (9个子文件)
System V
shmfifo.c 4KB
shmfifo.h 1KB
shmfifo_free.c 288B
shmfifo_recv.c 437B
ipc.h 289B
Makefile 412B
ipc.c 2KB
shmfifo_send.c 457B
笔记.txt 2KB
共 9 条
- 1
资源评论
- flyman2019-06-11挺好用的 ,说明很详细,对新手很有帮助,
- mrbryan2015-11-14非常有用,解决了我的困扰
编程-浪子
- 粉丝: 101
- 资源: 39
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功