读者-写者问题

读者-写者问题为数据库访问建立了一个模型。

设想一个飞机订票系统,其中许多竞争的进程试图写其中的数据。多个进程同时读数据库是可以接受的,但如果一个进程正在更新(写)数据库,则所有其他进程都不能访问该数据库,即使读操作也不行。这里的问题是如何对读者和写者进行编程。

在该解法中,第一个读者对信号量db执行down操作。随后的读者只是递增一个计数器rc。当读者离开时,就递减这个计数器。最后一个读者离开时对信号量db执行up操作,这样就允许一个阻塞的写者访问该数据库。

有个问题:如果每2秒钟有一个读者进来,每个读者读5秒钟,这样写者就永远没有机会了。

可以稍微改变下程序写法:在一个读者到达,且一个写者在等待时,读者在写者之后被挂起,而不是允许立即进入。这种方案的缺点是并发度和效率比较低。

#include <pthread.h>
#include <stdio.h>

#define READING_TIME 4
#define WRITTING_TIME 2
#define TIME_INTERVAL_READER 1
#define TIME_INTERVAL_WRITER 5

pthread_mutex_t mutex = PTHREAD_MUTEX_INITIALIZER,db=PTHREAD_MUTEX_INITIALIZER;
int rc=0;
int count=0;

void read_data_base(int i)
{
  printf("第 %d 个读者在读\n", i);
  sleep(READING_TIME);
  printf("第 %d 个读者读完\n", i);
}

void write_data_base()
{
  printf("正在写数据...\n");
  sleep(WRITTING_TIME);
}


void* reader(void* arg)
{
  while(1)
    {
      pthread_mutex_lock(&mutex);         //获得对rc的访问权
      rc=rc+1;
      count=count+1;
      if(rc==1) pthread_mutex_lock(&db);  //第一个读者时,不让写者访问
      pthread_mutex_unlock(&mutex);       //释放对rc的访问权
      read_data_base(count);                 //读数据
      pthread_mutex_lock(&mutex);         //获取对rc的访问权
      rc=rc-1;
      if(rc==0) pthread_mutex_unlock(&db);//最后一个读者,释放db访问权
      pthread_mutex_unlock(&mutex);
      sleep(TIME_INTERVAL_READER);
    }
}

void* writer(void* arg)
{
  while(1)
    {
      sleep(TIME_INTERVAL_WRITER);
      pthread_mutex_lock(&db);           //获得db访问
      write_data_base();                 //更新数据
      pthread_mutex_unlock(&db);         //释放访问权
    }
}


int main()
{
  pthread_t tid1,tid2;
  pthread_create(&tid1, NULL, reader,NULL);
  pthread_create(&tid2, NULL, writer,NULL);
  pthread_join(tid1, NULL);
  pthread_join(tid2, NULL);
  return 0;
}

上面的效率较低,在读的过程中一直占用着资源。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值