[pthread]读写锁

pthread_rwlock_t 结构体的定义:

struct {
     int __lock;
     unsigned int __nr_readers;  
     unsigned int __readers_wakeup;
     unsigned int __writer_wakeup;
     unsigned int __nr_readers_queued;
     unsigned int __nr_writers_queued;
     /* FLAGS must stay at this position in the structure to maintain binary compatibility.  */
     unsigned char __flags;
     unsigned char __shared;
     unsigned char __pad1;
     unsigned char __pad2;
     int __writer;
} __data;
说明
  1. 当我们使用pthread_rwlock_rdlock()获取一次读锁时,__nr_readers字段就会加一。就算是同一个线程,在已经获得读锁的情况下,再去获取读锁,__nr_readers字段仍然会加一的,当我们调用pthread_rwlock_unlock()一次时,__nr_readers就会减一,如果我们重复加了读锁,必须重复调用pthread_rwlock_unlock()来使__nr_readers减一,否则其他线程再想获取写锁时,是会阻塞的。
  2. __writer记录此时是谁占用着写锁,每一个线程都会用不同的ID号表示。
  3. __nr_readers_queued和__nr_writers_queued字段表示有多少线程正等待加锁。注意,当想要获取读锁,但是发现__nr_writers_queued字段不为0,自己是无法获取读锁的,防止线程饥饿。
  4. 如果获取了一次读锁,但是却错误的调用了两次pthread_rwlock_unlock(),会出现什么情况呢?自己在ubuntu上试了一下,__nr_readers变成了一个很大的数[0-1],造成以后的写锁可能再也获取不了。
  5. 如果自己已经获取了写锁,再去加读锁,pthread_rwlock_wrlock()是会返回出错的; 如果自己已经获取了读锁,再去加写锁,会出现死锁的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值