当前位置: 技术问答>linux和unix
求一个多进程之间的同步算法?
来源: 互联网 发布时间:2016-12-26
本文导语: 问题是这个样子的,现在有一个多进程之间共享的缓冲区,是一个循环队列。 定义如下: #define MAX 1024 type buf[MAX]; 对于这个共享缓冲区有多个写进程(生产者),只有一个读进程(消费者)。 任何一个时刻只...
问题是这个样子的,现在有一个多进程之间共享的缓冲区,是一个循环队列。
定义如下:
对于这个共享缓冲区有多个写进程(生产者),只有一个读进程(消费者)。
任何一个时刻只能够有一个写进程往共享缓冲区中写记录。只有当缓冲区中
有记录时,读进程才读记录。只有当缓冲区中有空闲时,写进程才可以往缓冲区
中写记录。
就是说,要实现多个写进程和一个读进程之间的同步。多个写进程所写的记录不能够
丢了。读进程需要把缓冲区读干净。因为后期我需要将这些记录写盘。
请问该何如写出这个同步算法,求算法伪代码?
谢谢!
我自己写了一个,但是有问题。
过后我贴上代码。
定义如下:
#define MAX 1024
type buf[MAX];
对于这个共享缓冲区有多个写进程(生产者),只有一个读进程(消费者)。
任何一个时刻只能够有一个写进程往共享缓冲区中写记录。只有当缓冲区中
有记录时,读进程才读记录。只有当缓冲区中有空闲时,写进程才可以往缓冲区
中写记录。
就是说,要实现多个写进程和一个读进程之间的同步。多个写进程所写的记录不能够
丢了。读进程需要把缓冲区读干净。因为后期我需要将这些记录写盘。
请问该何如写出这个同步算法,求算法伪代码?
谢谢!
我自己写了一个,但是有问题。
过后我贴上代码。
|
我觉得LZ在生产者中没有判断是否写满了就把锁释放了。
在消费者中没有判断是否读完了就把锁释放了!
在消费者中没有判断是否读完了就把锁释放了!
|
用到文件读写锁,信号
写进程的写入过程:
抓锁;
if buff满了
立即 放锁;
反悔等待下次抓锁;
else 写入;
if buff满了
发信号 告诉读进程;
放锁;
读进程的读过程写在两个地方,一个直接放在信号处理中,另外再做一个慢速的轮询:
信号来了
抓锁;
读,清理buff;
放锁;
轮询同上
存在的问题是轮询和信号的异步,这个可以做标志位把他俩拉开,具体要看需求了
写进程的写入过程:
抓锁;
if buff满了
立即 放锁;
反悔等待下次抓锁;
else 写入;
if buff满了
发信号 告诉读进程;
放锁;
读进程的读过程写在两个地方,一个直接放在信号处理中,另外再做一个慢速的轮询:
信号来了
抓锁;
读,清理buff;
放锁;
轮询同上
存在的问题是轮询和信号的异步,这个可以做标志位把他俩拉开,具体要看需求了
|
循环队列front==rear为空,(front+1)%LEN==rear为满,这是数据结构问题。