+ -
当前位置:首页 → 问答吧 → 求一个多进程之间的同步算法?

求一个多进程之间的同步算法?

时间:2011-08-14

来源:互联网

问题是这个样子的,现在有一个多进程之间共享的缓冲区,是一个循环队列。
定义如下:
C/C++ code


#define MAX 1024
type buf[MAX];




对于这个共享缓冲区有多个写进程(生产者),只有一个读进程(消费者)。
任何一个时刻只能够有一个写进程往共享缓冲区中写记录。只有当缓冲区中
有记录时,读进程才读记录。只有当缓冲区中有空闲时,写进程才可以往缓冲区
中写记录。
就是说,要实现多个写进程和一个读进程之间的同步。多个写进程所写的记录不能够
丢了。读进程需要把缓冲区读干净。因为后期我需要将这些记录写盘。
请问该何如写出这个同步算法,求算法伪代码?
谢谢!

我自己写了一个,但是有问题。
过后我贴上代码。

作者: luo6620378xu   发布时间: 2011-08-14

用到文件读写锁,信号
写进程的写入过程:
抓锁;
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

       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