当前位置: 首页 > news >正文

linux并发控制之读写自旋锁

读写自旋锁(rwlock)是一种比自旋锁粒度更小的自旋锁机制,它保留了“自旋”的概念。
但是在写操作方面,只能最多有一个写进程,在读方面,同时可拥有多个执行单元,当然读和写也不能同时进行。
一句话: 防写不防读
 
理解推荐: http://blog.sina.com.cn/s/blog_6d7fa49b01014q86.html
操作:
定义于#include<linux/rwlock.h>
或#include<linux/spinlock.h>

rwlock_t x;               
rwlock_init(&x);    //动态初始化
rwlock_t x=RW_LOCK_UNLOCKED;    //静态初始化 

void read_lock(rwlock_t *lock);    //如果不能获得,它将自旋,直到获得该读写锁
void read_unlock(rwlock_t *lock);
在对共享资源进行读取之前,应该先调用读锁定函数锁定共享资源,完成之后再调用读解锁函数释放共享资源

void write_lock(rwlock_t *lock);    //如果不能获得,它将自旋,直到获得该读写锁
void write_unlock(rwlock_t *lock);
在对共享资源进行写操作之前,应该先调用写锁定函数锁定共享资源,完成之后再调用写解锁函数释放共享资源

read_trylock(lock);
write_trylock(lock);

read_lock_irq(lock);    //读者获取读写锁,并禁止 本地中断
read_unlock_irq(lock);    //读者释放读写锁,并使能本地中断

write_lock_irq(lock);//写者获取读写锁,并禁止本地中断
write_unlock_irq(lock);

read_lock_irqsave(lock, flags);//读者获取读写锁,同时保存中断标志,并禁止本地中断
read_unlock_irqrestores(lock,flags);//读者释放读写锁,同时恢复中断标志,并使能本地中断

write_lock_irqsave(lock,flags);//写者获取读写锁,同时保存中断标志,并禁止本地中断
write_unlock_irqstore(lock,flags);

read_lock_bh(lock);//读者获取读写锁,并禁止 本地软中断
read_unlock_bh(lock);

write_lock_bh(lock);//写者获取读写锁,并禁止本地软中断
write_unlock_bh(lock);

用例:
rwlock_t lock;      //定义rwlock
rwlock_init(&lock);    //初始化rwlock

//读时获取锁
read_lock(&lock);
...临界区...
read_unlock(&lock);

 //写时获取锁
write_lock_irqsave(&lock, flags);
…临界区...
write_unlock_irqrestore(&lock, flags);

转载于:https://www.cnblogs.com/hehehaha/archive/2013/01/31/6332968.html

相关文章:

  • javascript访问加runat=server 的Html控件的方法
  • BobMusic
  • WPF个UI元素
  • Homework Exercises 1
  • 图片旋转和翻转
  • atoi简单实现
  • rndc: connect failed: 127.0.0.1#953: connection refused
  • 2013年
  • 我国多地进行区划调整
  • python制作galgame引擎(五)
  • HTML 重定向 ----定时跳转刷新页面
  • 管理Quarz的工具类,QuarzManager
  • 经验之谈:ping命令诊断网络故障
  • oracle ora-12154 无法解析连接字符串
  • 关于Android的多种屏幕适配
  • 9月CHINA-PUB-OPENDAY技术沙龙——IPHONE
  • 【5+】跨webview多页面 触发事件(二)
  • 【MySQL经典案例分析】 Waiting for table metadata lock
  • android 一些 utils
  • CSS居中完全指南——构建CSS居中决策树
  • es6要点
  • Git同步原始仓库到Fork仓库中
  • HashMap ConcurrentHashMap
  • js学习笔记
  • Kibana配置logstash,报表一体化
  • Map集合、散列表、红黑树介绍
  • Node项目之评分系统(二)- 数据库设计
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • Spring-boot 启动时碰到的错误
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 从零到一:用Phaser.js写意地开发小游戏(Chapter 3 - 加载游戏资源)
  • 工程优化暨babel升级小记
  • 欢迎参加第二届中国游戏开发者大会
  • 基于Vue2全家桶的移动端AppDEMO实现
  • 技术胖1-4季视频复习— (看视频笔记)
  • 开源SQL-on-Hadoop系统一览
  • 前端每日实战 2018 年 7 月份项目汇总(共 29 个项目)
  • 如何正确配置 Ubuntu 14.04 服务器?
  • 我从编程教室毕业
  • 智能合约Solidity教程-事件和日志(一)
  • ​如何在iOS手机上查看应用日志
  • ​软考-高级-系统架构设计师教程(清华第2版)【第12章 信息系统架构设计理论与实践(P420~465)-思维导图】​
  • #每日一题合集#牛客JZ23-JZ33
  • #数学建模# 线性规划问题的Matlab求解
  • (1)(1.8) MSP(MultiWii 串行协议)(4.1 版)
  • (动态规划)5. 最长回文子串 java解决
  • (二)hibernate配置管理
  • (二)windows配置JDK环境
  • (附源码)springboot学生选课系统 毕业设计 612555
  • (附源码)计算机毕业设计ssm-Java网名推荐系统
  • (附源码)计算机毕业设计SSM基于java的云顶博客系统
  • (十六)串口UART
  • (实战)静默dbca安装创建数据库 --参数说明+举例
  • (算法二)滑动窗口
  • (一)Neo4j下载安装以及初次使用