+ -
当前位置:首页 → 问答吧 →  求一个同步PV操作算法?

求一个同步PV操作算法?

时间:2011-07-26

来源:互联网

问题是这个样子的,有三个线程1,2,3.
两个缓冲区,其中第一个缓冲区是一个
char []数组,缓存一条记录;第二个缓冲区是一个
string []数组,缓存多条记录。
1号线程每次一往char缓冲区中写入
一条记录,
2号线程每一次从char缓冲区中读取
一条记录,将其写入string缓冲区中。
3号线程,只有当string缓冲区中的记录
数目达到MAX条时,才从string缓冲区中
读取MAX条记录。

同步原则是,只有当char缓冲区空时,1号
线程才可以往其中写入数据,只有当char
缓冲区中有数据时,2号线程才去读取数据
写入string缓冲区中。同时只有当string
缓冲区中MAX条记录被3号线程读取完毕之后
2号线程才可往其中写入数据。
只有当string缓冲区中有MAX条记录的时候
3号线程才可以从中读取数据。
也就是说三个线程需要同步。

求PV操作算法,谢谢!


作者: luo6620378xu   发布时间: 2011-07-26

自己写的一个,不知道对不对?请指教,谢谢!


C/C++ code

//不知道这样子写是否正确?

/*
 ch_sem0,ch_sem1同步char缓冲区
 str_sem0,str_sem1同步string缓冲区 
records记录string缓冲区记录数目
*/
 //初始化信号量
  if(sem_init(&ch_sem0,0,0)!=0)
    handle_error("init ch_sem0 failed");

  if(sem_init(&ch_sem1,0,1)!=0)
    handle_error("init ch_sem1 failed");

  if(sem_init(&str_sem0,0,0)!=0)
   handle_error("init str_sem0 failed");

   if(sem_init(&str_sem1,0,1)!=0)
     handle_error("init str_sem1 failed");

   //初始化互斥量
   if(pthread_mutex_init(&mutex,NULL)!=0)
      handle_error("init mutex failed");
   int records=0;

1号线程:

void * _1(void *)
{
    for(;;)
    {
        sem_wait(&ch_sem1);//char缓冲区是否可以写数据
        //往char缓冲区写数据 
        sem_post(&ch_sem0);//唤醒2号线程
    }
}


2号线程:
void * _2(void *)
{

    for(;;)
    {
             sem_wait(&ch_sem0);//阻塞自己,直到char缓冲中有记录
        //读char缓冲区中的内容,
        sem_post(&ch_sem1);//通知1号线程可以往char缓冲区中写数据了

         if(records==0)//string缓冲区中的数据被读光了
           sem_wait(&str_sem1);

         // 将其写入string缓冲区中,

         pthread_mutex_lock(&mutex);
        records++;//records指示下一条记录写入的位置
         pthread_mutex_unlock(&mutex);

        if(records==MAX)
           sem_post(&str_sem0);//通知3号线程可以读取记录了    
    }
}

3号线程:
void * _3(void *)
{
    for(;;)
    {
            sem_wait(&str_sem0);//等待string缓冲区中有规定数目的记录可供读取
       //取走string缓冲区中的MAX条记录

          pthread_mutex_lock(&mutex);
        records=0;//records值原始位置
         pthread_mutex_unlock(&mutex);

         sem_post(&str_sem1);//通知2线程可以再次写入数据了

    }
}





作者: luo6620378xu   发布时间: 2011-07-26

总感觉这个不靠谱!

作者: luo6620378xu   发布时间: 2011-07-26