求一个多进程之间的同步算法?
时间:2011-08-14
来源:互联网
问题是这个样子的,现在有一个多进程之间共享的缓冲区,是一个循环队列。
定义如下:
C/C++ code
对于这个共享缓冲区有多个写进程(生产者),只有一个读进程(消费者)。
任何一个时刻只能够有一个写进程往共享缓冲区中写记录。只有当缓冲区中
有记录时,读进程才读记录。只有当缓冲区中有空闲时,写进程才可以往缓冲区
中写记录。
就是说,要实现多个写进程和一个读进程之间的同步。多个写进程所写的记录不能够
丢了。读进程需要把缓冲区读干净。因为后期我需要将这些记录写盘。
请问该何如写出这个同步算法,求算法伪代码?
谢谢!
我自己写了一个,但是有问题。
过后我贴上代码。
定义如下:
C/C++ code
#define MAX 1024 type buf[MAX];
对于这个共享缓冲区有多个写进程(生产者),只有一个读进程(消费者)。
任何一个时刻只能够有一个写进程往共享缓冲区中写记录。只有当缓冲区中
有记录时,读进程才读记录。只有当缓冲区中有空闲时,写进程才可以往缓冲区
中写记录。
就是说,要实现多个写进程和一个读进程之间的同步。多个写进程所写的记录不能够
丢了。读进程需要把缓冲区读干净。因为后期我需要将这些记录写盘。
请问该何如写出这个同步算法,求算法伪代码?
谢谢!
我自己写了一个,但是有问题。
过后我贴上代码。
作者: luo6620378xu 发布时间: 2011-08-14
用到文件读写锁,信号
写进程的写入过程:
抓锁;
if buff满了
立即 放锁;
反悔等待下次抓锁;
else 写入;
if buff满了
发信号 告诉读进程;
放锁;
读进程的读过程写在两个地方,一个直接放在信号处理中,另外再做一个慢速的轮询:
信号来了
抓锁;
读,清理buff;
放锁;
轮询同上
存在的问题是轮询和信号的异步,这个可以做标志位把他俩拉开,具体要看需求了
写进程的写入过程:
抓锁;
if buff满了
立即 放锁;
反悔等待下次抓锁;
else 写入;
if buff满了
发信号 告诉读进程;
放锁;
读进程的读过程写在两个地方,一个直接放在信号处理中,另外再做一个慢速的轮询:
信号来了
抓锁;
读,清理buff;
放锁;
轮询同上
存在的问题是轮询和信号的异步,这个可以做标志位把他俩拉开,具体要看需求了
作者: yiyaaixuexi 发布时间: 2011-08-14
顶顶更健康
作者: luo6620378xu 发布时间: 2011-08-14
我下面的同步算法有问题,不知道为什么?
初始化:
empty=MAX;
full=0;
in=0;//写计数器
dout=0;//读计数器
生产者:
C/C++ code
消费者:
C/C++ code
这个同步算法,无论是一个写进程对一个读进程,还是多个写进程对一个读进程。
当程序运行一段时间过后,读进程这边的计数器就乱了。也不是乱了,就是他并不等待
写进程写,自己一直读。
按理说不应该这样子的,我的逻辑是就算缓冲区有空闲,或者有记录,都需要获得
那把互斥锁才可以去读写共享缓冲区。
现在的那把锁get_lock();是一把线程级的互斥锁,但是在进程间共享。
这是那把锁的初始化代码:
C/C++ code
另外就算我把这把互斥锁换掉,换成进程间的互斥信号量,就是只有0和1取值的信号量。
结果还是一样的。
我想应该是我的这个同步算法有问题。
但是又不知道问题在哪里,请指教。谢谢!
而且有的时候我开起3个写进程,每一个写了6万条都是正常的。
初始化:
empty=MAX;
full=0;
in=0;//写计数器
dout=0;//读计数器
生产者:
C/C++ code
wait(empty); get_lock();//这是一把互斥锁 //放入缓冲区中, in=(++in)%MAX; release_lock(); post(full);
消费者:
C/C++ code
wait(full); get_lock(); //取一条记录 dout=((++dout)%MAX); release_lock(); post(empty);
这个同步算法,无论是一个写进程对一个读进程,还是多个写进程对一个读进程。
当程序运行一段时间过后,读进程这边的计数器就乱了。也不是乱了,就是他并不等待
写进程写,自己一直读。
按理说不应该这样子的,我的逻辑是就算缓冲区有空闲,或者有记录,都需要获得
那把互斥锁才可以去读写共享缓冲区。
现在的那把锁get_lock();是一把线程级的互斥锁,但是在进程间共享。
这是那把锁的初始化代码:
C/C++ code
void init_lock() { int fd=open("/dev/zero",O_RDWR,0); pthread_mutexattr_t mattr; mutex_ptr=(pthread_mutex_t *)mmap(0,sizeof(pthread_mutex_t),PROT_READ|PROT_WRITE,MAP_SHARED,fd,0); close(fd); pthread_mutexattr_init(&mattr); pthread_mutexattr_setpshared(&mattr,PTHREAD_PROCESS_SHARED); pthread_mutex_init(mutex_ptr,&mattr); }
另外就算我把这把互斥锁换掉,换成进程间的互斥信号量,就是只有0和1取值的信号量。
结果还是一样的。
我想应该是我的这个同步算法有问题。
但是又不知道问题在哪里,请指教。谢谢!
而且有的时候我开起3个写进程,每一个写了6万条都是正常的。
作者: luo6620378xu 发布时间: 2011-08-14
相关阅读 更多
热门阅读
-
office 2019专业增强版最新2021版激活秘钥/序列号/激活码推荐 附激活工具
阅读:74
-
如何安装mysql8.0
阅读:31
-
Word快速设置标题样式步骤详解
阅读:28
-
20+道必知必会的Vue面试题(附答案解析)
阅读:37
-
HTML如何制作表单
阅读:22
-
百词斩可以改天数吗?当然可以,4个步骤轻松修改天数!
阅读:31
-
ET文件格式和XLS格式文件之间如何转化?
阅读:24
-
react和vue的区别及优缺点是什么
阅读:121
-
支付宝人脸识别如何关闭?
阅读:21
-
腾讯微云怎么修改照片或视频备份路径?
阅读:28