情况:
- 程序正在使用
pthread_rwlock_t
,比如说foolock
- 一个线程,比如 T1,
pthread_rwlock_wrlock()
在foolock
- T1 尝试获取读锁 (
pthread_rwlock_rdlock()
) onfoolock
- 没有其他线程拥有读锁或写锁
foolock
- 有匹配的解锁。
预计会发生什么?
程序(特别是 T1)收到一个错误:
pthread_rwlock_rdlock() returns EDEADLK ("Resource deadlock avoided").
选择这种行为的动机是什么?如果授予读锁会出现什么问题?
什么可能是解决这种情况的好方法?或许,T1 需要维护一些它已经持有写锁的状态foolock
。还有什么建议吗?
我的测试平台是Linux 2.6.32-431.11.2.el6.x86_64,NPTL 2.12
编辑1:很少澄清:
- 我不是想将读锁升级为写锁
- 我不是想将写锁降级为读锁
- 我正在探索在已经获得写锁时是否可以授予读锁请求。
简化上下文:
- 我正在尝试提供两个公共 API:(1)
find()
和 (2)update()
find()
采用读锁update()
使用写锁update()
实现要调用 find() <<--问题
我目前的做法是:
- 让每个公共API都有对应的无锁私有版本
公共 API 执行 3 个步骤:
- (a) 获得适当的锁,
- (b) 调用私人版本,
- (c) 释放锁