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

按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 呢。

读写锁优先级的问题解决了相关推荐

  1. Linux下pthread的读写锁的优先级问题

    有这么一个情况:有一个C实现的HashMap,需要在多个线程之间共享.对它的读操作远远大于写操作.所以采用了pthread的读写锁来保障并发读写时的一致性. 现在测试发现的问题是:因为读操作太多,导致 ...

  2. java锁(公平锁和非公平锁、可重入锁(又名递归锁)、自旋锁、独占锁(写)/共享锁(读)/互斥锁、读写锁)

    前言 本文对Java的一些锁的概念和实现做个整理,涉及:公平锁和非公平锁.可重入锁(又名递归锁).自旋锁.独占锁(写)/共享锁(读)/互斥锁.读写锁 公平锁和非公平锁 概念 公平锁是指多个线程按照申请 ...

  3. QThread中的互斥、读写锁、信号量、条件变量

    该文出自:http://www.civilnet.cn/bbs/browse.php?topicno=78431 在gemfield的<从pthread到QThread>一文中我们了解了线 ...

  4. PHP程序中的文件锁、互斥锁、读写锁使用技巧解析

    文件锁全名叫 advisory file lock, 书中有提及. 这类锁比较常见,例如 mysql, php-fpm 启动之后都会有一个pid文件记录了进程id,这个文件就是文件锁. 这个锁可以防止 ...

  5. Java 读写锁实现原理

    2019独角兽企业重金招聘Python工程师标准>>> 最近做的一个小项目中有这样的需求:整个项目有一份config.json保存着项目的一些配置,是存储在本地文件的一个资源,并且应 ...

  6. golang中的读写锁

    简介 互斥锁本质是当一个协程访问的时候,其他协程都不能访问. 其实主要是想:修改数据要同步,这样其他协程才可以感知到,所以真正的互斥应该是读取和修改,修改和修改之间,读和读是没有互斥操作的必要的 读写 ...

  7. linux线程下的读写锁

    读写锁实际是一种特殊的自旋锁,它把对共享资源的访问者划分成读者和写者,读者只对共享资源进行读访问,写者则需要对共享资源进行写操作.这种锁相对于自旋锁而言,能提高并发性,因为在多处理器系统中,它允许同时 ...

  8. java 写优先锁_Lock读写锁的优先度比较

    使用两个线程竞争读锁,一个线程竞争写锁.看读写锁的获取率. 代码如下 public class ThreadDuXieSuo { public static ReadWriteLocklock =ne ...

  9. 华为应用锁退出立即锁_面试官:你说说互斥锁、自旋锁、读写锁、悲观锁、乐观锁的应用场景...

    前言 生活中用到的锁,用途都比较简单粗暴,上锁基本是为了防止外人进来.电动车被偷等等. 但生活中也不是没有 BUG 的,比如加锁的电动车在「广西 - 窃·格瓦拉」面前,锁就是形同虚设,只要他愿意,他就 ...

  10. 怎么样用 Python 实现读写锁

    起步 Python 提供的多线程模型中并没有提供读写锁,读写锁相对于单纯的互斥锁,适用性更高,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁. 通俗点说就是当没有写锁时,就可以 ...

最新文章

  1. 深度学习基础(十二)—— ReLU vs PReLU
  2. ie导出excel是html文件路径,导出HTML到Excel中的IE11 - “拒绝访问”
  3. 算法——海量数据(5%)
  4. 高性能、低成本的高防 IP 产品能现实吗?
  5. 一步一步做搜索(一)
  6. 数学小技巧(模拟)求1/n
  7. python卡方拟合性检验_卡方拟合优度检验
  8. winform之控件在Panel中居中
  9. apesv100数据库_生物信息学相关数据库资源介绍..ppt
  10. 计算机仿真实验碰撞实验原理,车辆正面碰撞中的耐撞性能仿真分析
  11. 企业微信信息服务器保存,企业微信接入
  12. cocos2dx 精灵触摸
  13. 使用BMFont工具来精简字体库
  14. 【热血足球联盟】补丁记录
  15. Java串口助手 带UI界面 Java串口调试工具 FPV
  16. azure创建centos_如何使用Blazor和Azure计算机视觉创建光学字符读取器
  17. 【Windows必备软件】01 Groupy 实现你所有的窗口标签化管理
  18. 用百度搜索sb,第一个结果是??
  19. 基于Springboot+vue实现前后端分离二手图书交易
  20. Acer Predator PT715 Quanta ZGL REV3A笔记本电路原理图纸

热门文章

  1. android APN的打开与关闭
  2. spring cloud redis lock
  3. 0903 - Firebase Analytics PK Google Analytics
  4. javascript 函数的变量与作用域
  5. grid@m3#39;s password: Permission denied, please try again.
  6. JavaScript技巧写法
  7. 搭建一个wordpress
  8. SharePoint 2013 创建web应用程序报错This page can’t be displayed
  9. [转载] 全本张广泰——第十九回 御赐黄马褂 奉旨喜还乡
  10. 实现接口与显式实现接口的区别