关于pthread_rwlock_t读写锁产生死锁的情况

对于pthread_rwlock_t读写锁:
一个线程持有着写锁,又去加(该锁的)读锁,可能会产生死锁。
一个线程持有着(读或者写)锁,又去加(该锁的)写锁,可能会产生死锁。
此时pthread_rwlock_rdlock和pthread_rwlock_wrlock会返回EDEADLK,加锁失败。

pthread_rwlock_rdlock:If a writer holds the lock, the calling thread shall not acquire the read lock. The calling thread may deadlock if at the time the call is made it holds a write lock.

pthread_rwlock_wrlock:The calling thread may deadlock if at the time the call is made it holds the read-write lock (whether a read or write lock).

另外pthread_rwlock_rdlock还可能返回EAGAIN,意为读锁已达上限。除此之外,两个函数不会返回其他错误了。

如果不检查pthread_rwlock_rdlock和pthread_rwlock_wrlock的返回值,就认为返回后就拿到了锁,会产生未定义后果,比如:

printf("EDEADLK is %d\n", EDEADLK);
printf("EAGAIN is %d\n", EAGAIN);

int ret = 0;
pthread_rwlock_t lock = PTHREAD_RWLOCK_INITIALIZER;
ret = pthread_rwlock_wrlock(&lock);
printf("wrlock return value is %d\n", ret);
ret = pthread_rwlock_rdlock(&lock); //加锁失败!
printf("rdlock return value is %d\n", ret);
pthread_rwlock_unlock(&lock);
pthread_rwlock_unlock(&lock); //本线程未加锁却解锁会产生未定义后果

ret = pthread_rwlock_rdlock(&lock);
printf("rdlock return value is %d\n", ret);
pthread_rwlock_unlock(&lock);

这段代码看着可能很傻,但如果将写锁和读锁放到两个函数里,一个函数调用另一个函数,就比较容易发生了。
所以加锁的时候要判断下返回值,如果是EDEADLK,可以直接终止程序。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值