mysql 申请读锁 再申请写锁_MySQL源代码:如何对读写锁进行处理
2.加锁
加锁函数由宏定义,实际调用函数为:
1)写锁
[cpp]
# define rw_lock_x_lock(M) \
rw_lock_x_lock_func((M),0, __FILE__, __LINE__)当申请写锁时,执行如下步骤:
(1).调用rw_lock_x_lock_low函数去获取锁,如果得到锁,则rw_x_spin_round_count += i后直接返回,如果得不到锁,继续执行
(2).loop过程中只执行一次rw_x_spin_wait_count++
(3).在毫秒级别的loop多次等待
[cpp]
while(i
&& lock->lock_word <= 0) {
if(srv_spin_wait_delay) {
ut_delay(ut_rnd_interval(0,
srv_spin_wait_delay));
}
i++;
}这里涉及到两个系统变量:
innodb_sync_spin_loops(SYNC_SPIN_ROUNDS)
innodb_spin_wait_delay(srv_spin_wait_delay)
在SYNC_SPIN_ROUNDS循环里调用函数ut_delay,这个函数很简单,就是做了delay*50次空循环
[cpp]
Ut_delay(uint delay):
for(i = 0; i
j+= i;
UT_RELAX_CPU();
}
其中,UT_RELAX_CPU()会调用汇编指令来独占CPU,以防止线程切换
(4).如果loop的次数等于SYNC_SPIN_ROUNDS,调用os_thread_yield(实际调用pthread_yield,导致调用线程放弃 CPU的占用)将线程挂起;否则挑到1继续loop
(5).在sync_primary_wait_array里获取一个cell(占个坑?)。调用sync_array_reserve_cell,看起来有1000个坑位(sync_primary_wait_array->n_cells)
(6).再次调用rw_lock_x_lock_low函数尝试获取锁,若成功获得,则返回
(7).调用sync_array_wait_event等待条件变量,然后返回1继续loop
具体的加锁函数(rw_lock_x_lock_low)稍后分析
2)读锁
[cpp]
# define rw_lock_s_lock(M) \
rw_lock_s_lock_func((M),0, __FILE__, __LINE__)这个函数定义在sync0rw.ic里,函数也很简单,如下:
[cpp]
if(rw_lock_s_lock_low(lock, pass, file_name, line)) {
return;/* Success */
}else{
/* Did not succeed, try spin wait */
rw_lock_s_lock_spin(lock, pass, file_name, line);
return;
}这里首先调用rw_lock_s_lock_low进行加锁,如果加锁不成功,则调用rw_lock_s_lock_spin进行等待,rw_lock_s_lock_spin的代码逻辑与rw_lock_x_lock_func有些相似,这里不再赘述。
在rw_lock_s_lock_spin里会递归的调用到rw_lock_s_lock_low函数;
mysql 申请读锁 再申请写锁_MySQL源代码:如何对读写锁进行处理相关推荐
- ReentrantReadWriteLock——读写锁如何升级,为何读写锁不能插队?
我们主要探讨读锁应该插队吗?以及什么是读写锁的升降级. 读锁插队策略: 首先,我们来看一下读锁的插队策略,在这里先快速回顾一下在 24 课时公平与非公平锁中讲到的 ReentrantLock, ...
- windows 读写锁 python_用Python实现读写锁
起步 简单的实现 import threading class RWlock(object): def __init__(self): self._lock = threading.Lock() se ...
- windows 读写锁 python_用Python实现读写锁的示例代码
起步 Python 提供的多线程模型中并没有提供读写锁,读写锁相对于单纯的互斥锁,适用性更高,可以多个线程同时占用读模式的读写锁,但是只能一个线程占用写模式的读写锁. 通俗点说就是当没有写锁时,就可以 ...
- linux 进程 读写锁,linux 下实现高性能读写锁(read/write lock)
前一篇文章分析了Windows slim read/write lock的工作原理.我们知道它的设计相当精妙,于是我们可以借鉴它的思路来设计linux下的读写锁. 在这个读写锁的设计上,需要注意的是l ...
- mysql先排序再分组筛选_mysql 怎样先排序再分组
权游游牧族:众所周知!一句SqL语句不能先排序再分组.所以这里给出几个案例 --表结构-- create table `shop` ( `id` int (10) PRIMARY KEY, `shop ...
- linux将mysql中得配置为可读写_MySQL注入 利用系统读、写文件
能读写文件的前提 不同系统.不同的数据库版本有细微差异,以下实验在Windows10和Mysql 5.7.26下操作: 1.拥有该File的读权限 or 该目录写的权限 2.当前用户的secure_f ...
- mysql 显示帐号被锁定_mysql锁
1. 查看表锁命令 mysql> show open tables; In_use为0 ,表示没有锁表 2. 锁表 2.1 给表上读锁 lock table tb_emp read; 2.2 给 ...
- 【Linux系统编程】线程同步与互斥:读写锁
读写锁基本原理 当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住.但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互 ...
- c/c++:线程同步(互斥锁、死锁、读写锁、条件变量、生产者和消费者模型、信号量)
目录 1. 概念 2. 互斥锁 3. 死锁 4. 读写锁 5. 条件变量 5.1 生产者和消费者模型 6. 信号量 1. 概念 线程同步: > 当有一个线程在对内存进行操作时,其他线程都不可以对 ...
最新文章
- android apk签名工具_Android 应用修改为系统签名的方法(macOS)
- mysql输入select now()_mysql 中select now(); 是怎么执行的?没有指定FROM tablename?
- java 注解妙用_框架开发之Java注解的妙用
- .Net Cancellable Task - APM异步超时机制扩展
- 基于word API 创建的可以打开word的自定义控件
- ServletContext、ServletConfig(FilterConfig)学习笔记
- 查看jvm的full gc的频率
- android 双系统 一加5,[一加2][双ROM]一加手机2安装双系统教程
- phoenix表操作
- MenuItem 对象
- UE4 自定义DLC Pak加载
- FAT32文件操作系统
- 中国科技统计年鉴面板数据Excel格式(2009-2019年)
- 你的忧伤,是我青春路过的彷徨
- 幸福的小故事,愿岁月安好
- 【读论文】基于深度学习的铁路道岔转辙机故障诊断(3DESIGN)
- java 获取est时间_java – 在EST时区获取XMLGregorianCalendar日期
- Linux终端连接遇到的两个问题
- 4G网速变慢?工信部回应:近期全国4G网速整体保持稳定
- 从浮华的管理驾驶舱,到务实的企业信息化
热门文章
- SSMS(Microsoft SQL Server Management Studio 18)
- scratch做简单跑酷游戏_育儿这样做,宝宝更聪明,简单又实用的家庭感统训练游戏推荐...
- 中软国际云专业服务获双冠王,IDC排名火热出炉
- C/C++ 病毒破坏手法总结
- web自动化之trigger()常用鼠标操作事件
- javascript面向对象(三):class语法详解
- 简历石沉大海?程序员简历到底该怎么写?
- mysql 主从ppt_mysql主从配置
- 使用map_server保存并使用已有地图
- 北京地铁21号线_北京迎来地铁大动脉,设有21站,全为地下线,沿线市民幸运了...