读写锁优先级的问题解决了

这个问题就是:对一个同享的数据布局,读的频率远弘远于写,所以用了读写锁.但是发现写线程老是抢不到锁.

按The Open Group 的Single UNIX? Specification所说,"Thepthread_rwlock_rdlock() function applies a read lock to the read-write lock referenced by rwlock. The calling thread acquires the read lock if a writer does not hold the lock and there are no writers blocked on the lock. It is unspecified whether the calling thread acquires the lock when a writer does not hold the lock and there are writers waiting for the lock" 意思就是说,没有writer在等写锁的时辰,reader是可以拿到读锁的。然则没有划定,若是有writer在期待写锁,该若何?

还好,Linux有pthread_rwlockattr_setkind_np这个函数,惋惜我用man查不到这个函数。我是在pthread.h头文件中发现的。

enum
{
PTHREAD_RWLOCK_PREFER_READER_NP,
PTHREAD_RWLOCK_PREFER_WRITER_NP,
PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP,
PTHREAD_RWLOCK_DEFAULT_NP = PTHREAD_RWLOCK_PREFER_READER_NP
};
?
extern int pthread_rwlockattr_setkind_np (pthread_rwlockattr_t *__attr,
int __pref) __THROW __nonnull ((1));

看到这些,我觉得这事不就这么简单的就解决了吗?默许是reader优先,改成writer优先不就好了吗?唰唰唰的写代码,同时在网上搜了一下,csdn上还有人很当真的教他人怎样用这个函数。啧啧!

pthread_rwlockattr_setkind_np(&attr,PTHREAD_RWLOCK_PREFER_WRITER_NP);

没用!为啥呢?连man页都没有,所以我思疑这个函数没实现,因而就用debuginfo-install glibc? 装glibc的调试符号,然后用gdb跟进去,发现pthread_rwlockattr_setkind_np确切是有实现的,代码很简单,更改了attr的一个成员变量。那是为啥呢?

再谷歌,终究找到了pthread_rwlockattr_setkind_np的man page,末尾有一段notes,让我年夜汗:

“Setting the value read-write lock kind to PTHREAD_RWLOCK_PREFER_WRITER_NP, results in the same behavior as setting the value to PTHREAD_RWLOCK_PREFER_READER_NP. As long as a reader thread holds the lock the thread holding a write lock will be starved. Setting the kind value to PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP, allows the writer to run. However, the writer may not be recursive as is implied by the name. “

意思就是说,PTHREAD_RWLOCK_PREFER_WRITER_NP和PTHREAD_RWLOCK_PREFER_WRITER_NP是一样滴!应当设置成PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP才对!可是PTHREAD_RWLOCK_PREFER_WRITER_NONRECURSIVE_NP也是名存实亡滴,它才不会recursive 呢。

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这个问题通常发生在访问未解锁的外设寄存器时,导致总线错误(BUS_FAULT)。解决这个问题的方法取决于你所使用的处理器和开发环境。下面是一些可能的解决方案: 1. 确保正确配置外设寄存器:确保你正确地配置了外设寄存器,包括解锁操作。对于不同的处理器和外设,配置方法可能会有所不同。请参考相关的处理器手册或外设文档,确保寄存器的访问权限已经正确设置。 2. 检查寄存器地址和访问模式:确保你正在访问正确的寄存器地址,并且使用正确的读写模式。某些外设可能有特定的读写要求,如只读或只写。确保你的代码与外设的要求一致。 3. 检查中断和优先级设置:如果你的代码中涉及中断,确保中断优先级正确设置,并且中断处理程序中没有对未解锁的寄存器进行访问。有时,中断处理程序中对未解锁寄存器的访问可能导致总线错误。 4. 检查时钟和电源配置:某些外设可能需要正确的时钟和电源配置才能正常工作。确保你已经正确配置了时钟和电源,并且外设能够正常启动。 5. 调试和排除故障:如果以上步骤都没有解决问题,你可以使用调试工具来跟踪代码执行过程,查看发生错误的具体位置。通过检查相关的寄存器状态和堆栈信息,你可以进一步分析和解决问题。 总的来说,解决这个问题需要仔细检查代码、配置和环境设置,并确保与外设的交互正确无误。如果问题仍然存在,你可能需要进一步研究和调试,以找到更具体的解决方案。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值