读者写者之模型--同步问题

16 篇文章 0 订阅

再上一篇中,介绍了生产者消费者模型[https://blog.csdn.net/Misszhoudandan/article/details/80715426]
今天介绍读者写者模型(读多写少的场景)

场景描述:
  1. 写者负责再资源池中写
  2. 读者负责从资源池中读数据
  3. 同一时间内不允许多个写者进行写,但允许多个读者进行读
  4. 当写者和读者都准备占用资源池时,写者优先占用资源池(此问题描述的时写者优先级高的场景)
建立模型
  1. 一个交易场所(资源池),此处用一个变量供读者和写者进行读写
  2. 两种角色,一组读者线程和一组写者线程
  3. 三种关系:
    .读者和写者之间为互斥关系,写者优先级高
    .读者和读者之间为共享关系(没有互斥关系)
    .写者和写者之间为互斥关系
代码实现

这里采用POXI线程库中的读写锁来实现

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

//读者写者模型(读的频率高,写的频率低)

//读者和读者之间关系为  共享
//写者和写者之间关系为  互斥
//读者和写者之间关系为  同步互斥关系


//读写锁
//读者加读锁(读者之间共享)
//写者加写锁(写者之间互斥)
//写者优先获取锁(写者优先级高)


pthread_rwlock_t rw_lock;//定义一个读写锁


//*******实现一个交易场所********************

int count;

//***********实现三种关系**********************
//实现写着
void * Write(void * arg)
{
  (void)arg;
  while(1)
  {
    usleep(1000);
    pthread_rwlock_wrlock(&rw_lock);//在写之前加写锁

    printf("写入:%d\n",++count);

    pthread_rwlock_unlock(&rw_lock);//写之后释放锁
    usleep(7658);
  }
  return NULL;
}

//实现读者
void * Read(void * arg)
{
  (void)arg;
  while(1)
  {
    pthread_rwlock_rdlock(&rw_lock);//在读之前加读锁

    printf("读出:%d\n",count);

    pthread_rwlock_unlock(&rw_lock);//读之后释放锁
    usleep(500);
  }
  return NULL;
}

//******************两种角色*******************
void test()
{
  const int N=8;
  pthread_t thread[N];
  int i=0;

  pthread_rwlock_init(&rw_lock,NULL);//对读写锁进行初始化

  //创建写者线程
  for(i=0;i<N/2;i++)
  {
    pthread_create(&thread[i],NULL,Write,NULL);
  }
  //创建读者线程
  for(i=0;i<N-N/2;i++)
  {
    pthread_create(&thread[i],NULL,Read,NULL);
  }

  //等待线程结束
  for(i=0;i<N;i++)
  {
    pthread_join(thread[i],NULL);
  }

  pthread_rwlock_destroy(&rw_lock);//销毁读写锁
}


int main()
{
  test();
  return 0;
}

结果展示:
执行结果

我们看到写者之间是互斥的(每次写入的值都不同)
读者之间是共享的(可以读出相同的值)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值