Pthread实现读写锁

Pthread实现读写锁

1. 博客内容:

编写Pthread程序,使用两个条件变量和一个互斥量来实现一个读写锁。比较当读优先级更高时和写优先级更高时程序的性能。并进行归纳总结。

2. 实现思路:

2.1 读写锁:

读写锁是一种特殊的锁,它把对资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作。

一次只有一个线程可以占有写模式的读写锁,但是可以有多个线程占有读模式的读写锁。因此:

  • 当读写锁是写加锁的状态时,在这个锁被解锁之前,所有试图对这个锁加锁的线程都会被阻塞;

  • 当读写锁在读加锁状态时,所有试图以读模式对它进行加锁的线程都可以获得锁,但是所有试图以写模式对这个锁加锁的线程都会被阻塞;

读优先和写优先:

  • 读优先:给读者优先权,只要读写锁不是写加锁的状态,就可以进行读加锁,同时,当一个写线程解锁时,它应该优先唤醒所有的读加锁等待的线程;

  • 写优先:给写者优先权,只有在当前状态不是写加锁并且没有写等待时,读加锁才能成功,否则就要等待,同时,当一个写线程解锁时,它应该优先唤醒一个写加锁等待的线程;

  1.   实现读写锁相关的数据结构:
    
  • 两个条件变量:分别阻塞读线程和写线程;

  • 两个读相关的变量,分别记录正在读取的线程数和正在等待读的线程数;

  • 两个写相关的变量,分别记录是否有正在写的线程和正在等待写的线程数;

  • 一个互斥量,互斥线程对于上述数据的访问和修改;

把这些变量打包成结构体就得到自己实现的读写锁的数据结构:

// self-definition read-write-lock
struct my_rwlock_t{

    // use to lock itself
    pthread_mutex_t mutex;

    // read conditional lock
    pthread_cond_t  read;

    //  write conditional lock
    pthread_cond_t  write;

    // record read and write threads
    int read_now;
    int read_wait;
    int write_now;
    int write_wait;
};

3. 相关函数:

3.1 读写锁初始化函数:

如图,初始化读写锁的条件变量,互斥锁和相关变量:

// initial read-write-lock
void my_rwlock_init(my_rwlock_t* rwlock){
    pthread_mutex_init(&(rwlock->mutex), NULL);

    pthread_cond_init(&(rwlock->read), NULL);

    pthread_cond_init(&(rwlock->write), NULL);

    rwlock->read_now = 0;
    rwlock->read_wait = 0;
    rwlock->write_now = 0;
    rwlock->write_wait = 0;
};

3.2 读写锁销毁函数:</

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值