旗标为所有调用者进行互斥, 不管每个线程可能想做什么. 然而, 很多任务分为 2 种清 楚的类型: 只需要读取被保护的数据结构的类型, 和必须做改变的类型. 允许多个并发读 者常常是可能的, 只要没有人试图做任何改变. 这样做能够显著提高性能; 只读的任务可 以并行进行它们的工作而不必等待其他读者退出临界区.

Linux 内核为这种情况提供一个特殊的旗标类型称为 rwsem (或者" reader/writer semaphore"). rwsem 在驱动中的使用相对较少, 但是有时它们有用.

使用 rwsem 的代码必须包含 <linux/rwsem.h>. 读者写者旗标 的相关数据类型是 struct rw_semaphore; 一个 rwsem 必须在运行时显式初始化:

void init_rwsem(struct rw_semaphore *sem);

一个新初始化的 rwsem 对出现的下一个任务( 读者或者写者 )是可用的. 对需要只读存 取的代码的接口是:

void down_read(struct rw_semaphore *sem);

int down_read_trylock(struct rw_semaphore *sem); void up_read(struct rw_semaphore *sem);

对 down_read 的调用提供了对被保护资源的只读存取, 与其他读者可能地并发地存取. 注意 down_read 可能将调用进程置为不可中断的睡眠. down_read_trylock 如果读存取 是不可用时不会等待; 如果被准予存取它返回非零, 否则是 0. 注意 down_read_trylock 的惯例不同于大部分的内核函数, 返回值 0 指示成功. 一个使用 down_read 获取的 rwsem 必须最终使用 up_read 释放.

读者的接口类似:

void down_write(struct rw_semaphore *sem);

int down_write_trylock(struct rw_semaphore *sem); void up_write(struct rw_semaphore *sem);

void downgrade_write(struct rw_semaphore *sem);

down_write, down_write_trylock, 和 up_write 全部就像它们的读者对应部分, 除了, 当然, 它们提供写存取. 如果你处于这样的情况, 需要一个写者锁来做一个快速改变, 接 着一个长时间的只读存取, 你可以使用 downgrade_write 在一旦你已完成改变后允许其 他读者进入.

一个 rwsem 允许一个读者或者不限数目的读者来持有旗标. 写者有优先权; 当一个写者 试图进入临界区, 就不会允许读者进入直到所有的写者完成了它们的工作. 这个实现可能 导致读者饥饿 -- 读者被长时间拒绝存取 -- 如果你有大量的写者来竞争旗标. 由于这个 原因, rwsem 最好用在很少请求写的时候, 并且写者只占用短时间.

最新文章

  1. Windows 服务的安装(1)
  2. html之table标签
  3. Python 文件读和写
  4. CISCO ASA 防火墙 IOS恢复与升级
  5. 毕向东JAVA视频讲解笔记(前三课)
  6. [Unity菜鸟] FBX模型动画提取
  7. Cocos2d-x3.0 捕Android菜单键和返回键
  8. POJ 1742 hdu 2844 Coins
  9. VMware下ubuntu与Windows实现文件共享的方法
  10. 使用CSS画图之三角形(一)
  11. Tarjan求割点 || Luogu P3388 【模板】割点(割顶)
  12. mysql之统一刷表
  13. domain
  14. jsp的page、request、session、application四个作用域的作用
  15. JS分页条插件
  16. Rancher之HA部署
  17. HBase 笔记3
  18. lua学习之循环打印九九乘法表
  19. Django models中关于blank与null
  20. 在数据库中(Oracle),根据时间查询数据: to_date()和to_char()函数

热门文章

  1. 利用幂等性区分HTTP的POST与PUT请求
  2. day39-Spring 19-今天的内容总结
  3. RDS 5.7三节点企业版时代的数据一致性解决方案
  4. PLAY2.6-SCALA(七) Streaming HTTP response
  5. ABP 重写主键ID 多表查询ID无效
  6. 2017校赛 问题 D: 我知道了,你知道了吗?【递归】
  7. php json_encode输出为空问题
  8. selenium 图片上传
  9. Linux下安装MySQL-python
  10. 解决ViewState过于庞大的问题