读写优先

动机:

  共享数据的访问

使用者:

  读者:只读数据集,不需要修改数据

  写者:读取和修改数据

原则:

  允许同一时间有多个读者,但在任何时候只有一个写者

  当没有写者时,读者才能访问数据

  当没有读者和写者时,写者才能访问数据

  在任何时候只有一个线程可以操作共享变量

 

读者优先

信号量实现

sem_t WriteMutex= 1;
sem_t CountReadMutex= 1;
int RCount= 0;

Reader()
{
sem_wait(CountReadMutex);
if(RCount ==0)
  sem_post(WriteMutex);
++RCount;
sem_post(CountReadMutex);

read;

sem_wait(CountReadMutex);
--RCount;
if(RCount ==0)
  sem_post(WriteMutex);
sem_post(CountReadMutex);
}


Writer()
{
sem_wat(WriteMutex);

write;

sem_post(WriteMutex);
}

 

管程实现 

int AR = 0; //active reader
int AW = 0; //active writer
int WR = 0; //waiting reader
int WW = 0; //waiting writer
Condition okToRead, okToWrite;
Lock lock;

Read()
{
  BeginRead();

  read;

  EndRead();
}

BeginRead()
{
  lock.acqure();
  while((AW)>0)//当写者正在写时,读者等待
  {
    ++WR;
    okToRead.wait(&lock);
    --WR;
  }
  ++AR;
  lock.release();
}

EndRead()
{
  lock.acqure();
  --AR;
  if(AR==0 && WW>0)
  {
    okToWrite.signal();
  }
  lock.release();
}

Write()
{
  BeginWrite();

  Write;

  EndWrite();
}

BeginWrite()
{
  lock.acqure();
  while((AR+AW+WR)>0)//当有读者在读 或 写者在写,或者读者在等时,都等待
  {
    ++WW;
    okToWrite.wait(&lock);
    --WW;
  }
  ++AW;
  lock.release();
}

EndWrite()
{
  lock.acqure();
  --AW;
  if(WR>0) //优先等待的读者
  {
    okToRead.broadcast();
  }
  else if(WW>0)
  {
    okToWrite.signal();
  }
  
  lock.release();
}

  

 

写者优先:

信号量实现

sem_t RWMutex = 1;
sem_t WriteMutex= 1;
sem_t CountReadMutex= 1;
sem_t CountWriteMutex= 1;
int RCount = 0;
int WCount = 0;


Reader()
{
sem_wat(RWMutex);
sem_wait(CountReadMutex);
if(RCount ==0)
  sem_post(WriteMutex);
++RCount;
sem_post(CountReadMutex);
sem_post(RWMutex);

read;

sem_wait(CountReadMutex);
--RCount;
if(RCount ==0)
  sem_post(WriteMutex);
sem_post(CountReadMutex);
}


Writer()
{
sem_wait(CountWriteMutex);
if(WCount ==0)
  sem_post(RWMutex);
++WCount ;
sem_post(CountWriteMutex);


sem_wat(WriteMutex);
write;
sem_post(WriteMutex);

sem_wait(CountWriteMutex);
--WCount ;
if(WCount ==0)
  sem_post(RWMutex);
sem_post(CountWriteMutex);
}

 

管程实现

int AR = 0; //active reader
int AW = 0; //active writer
int WR = 0; //waiting reader
int WW = 0; //waiting writer
Condition okToRead, okToWrite;
Lock lock;

Read()
{
  BeginRead();

  read;

  EndRead();
}

BeginRead()
{
  lock.acqure();
  while((AW+WW)>0)
  {
    ++WR;
    okToRead.wait(&lock);
    --WR;
  }
  ++AR;
  lock.release();
}

EndRead()
{
  lock.acqure();
  --AR;
  if(AR==0 && WW>0)
  {
    okToWrite.signal();
  }
  lock.release();
}


Write()
{
  BeginWrite();

  Write;

  EndWrite();
}

BeginWrite()
{
  lock.acqure();
  while((AR+AW)>0)
  {
    ++WW;
    okToWrite.wait(&lock);
    --WW;
  }
  ++AW;
  lock.release();
}

EndWrite()
{
  lock.acqure();
  --AW;
  if(WW>0)
  {
    okToWrite.signal();
  }
  else if(WR>0)
  {
    okToRead.broadcast();
  }
  lock.release();
}

  

 

posted on 2022-01-08 13:44  BraveMrFeng  阅读(44)  评论(0)    收藏  举报

导航