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源代码:如何对读写锁进行处理相关推荐

  1. ReentrantReadWriteLock——读写锁如何升级,为何读写锁不能插队?

    我们主要探讨读锁应该插队吗?以及什么是读写锁的升降级. 读锁插队策略:     首先,我们来看一下读锁的插队策略,在这里先快速回顾一下在 24 课时公平与非公平锁中讲到的 ReentrantLock, ...

  2. windows 读写锁 python_用Python实现读写锁

    起步 简单的实现 import threading class RWlock(object): def __init__(self): self._lock = threading.Lock() se ...

  3. windows 读写锁 python_用Python实现读写锁的示例代码

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

  4. linux 进程 读写锁,linux 下实现高性能读写锁(read/write lock)

    前一篇文章分析了Windows slim read/write lock的工作原理.我们知道它的设计相当精妙,于是我们可以借鉴它的思路来设计linux下的读写锁. 在这个读写锁的设计上,需要注意的是l ...

  5. mysql先排序再分组筛选_mysql 怎样先排序再分组

    权游游牧族:众所周知!一句SqL语句不能先排序再分组.所以这里给出几个案例 --表结构-- create table `shop` ( `id` int (10) PRIMARY KEY, `shop ...

  6. linux将mysql中得配置为可读写_MySQL注入 利用系统读、写文件

    能读写文件的前提 不同系统.不同的数据库版本有细微差异,以下实验在Windows10和Mysql 5.7.26下操作: 1.拥有该File的读权限 or 该目录写的权限 2.当前用户的secure_f ...

  7. mysql 显示帐号被锁定_mysql锁

    1. 查看表锁命令 mysql> show open tables; In_use为0 ,表示没有锁表 2. 锁表 2.1 给表上读锁 lock table tb_emp read; 2.2 给 ...

  8. 【Linux系统编程】线程同步与互斥:读写锁

    读写锁基本原理 当有一个线程已经持有互斥锁时,互斥锁将所有试图进入临界区的线程都阻塞住.但是考虑一种情形,当前持有互斥锁的线程只是要读访问共享资源,而同时有其它几个线程也想读取这个共享资源,但是由于互 ...

  9. c/c++:线程同步(互斥锁、死锁、读写锁、条件变量、生产者和消费者模型、信号量)

    目录 1. 概念 2. 互斥锁 3. 死锁 4. 读写锁 5. 条件变量 5.1 生产者和消费者模型 6. 信号量 1. 概念 线程同步: > 当有一个线程在对内存进行操作时,其他线程都不可以对 ...

最新文章

  1. android apk签名工具_Android 应用修改为系统签名的方法(macOS)
  2. mysql输入select now()_mysql 中select now(); 是怎么执行的?没有指定FROM tablename?
  3. java 注解妙用_框架开发之Java注解的妙用
  4. .Net Cancellable Task - APM异步超时机制扩展
  5. 基于word API 创建的可以打开word的自定义控件
  6. ServletContext、ServletConfig(FilterConfig)学习笔记
  7. 查看jvm的full gc的频率
  8. android 双系统 一加5,[一加2][双ROM]一加手机2安装双系统教程
  9. phoenix表操作
  10. MenuItem 对象
  11. UE4 自定义DLC Pak加载
  12. FAT32文件操作系统
  13. 中国科技统计年鉴面板数据Excel格式(2009-2019年)
  14. 你的忧伤,是我青春路过的彷徨
  15. 幸福的小故事,愿岁月安好
  16. 【读论文】基于深度学习的铁路道岔转辙机故障诊断(3DESIGN)
  17. java 获取est时间_java – 在EST时区获取XMLGregorianCalendar日期
  18. Linux终端连接遇到的两个问题
  19. 4G网速变慢?工信部回应:近期全国4G网速整体保持稳定
  20. 从浮华的管理驾驶舱,到务实的企业信息化

热门文章

  1. SSMS(Microsoft SQL Server Management Studio 18)
  2. scratch做简单跑酷游戏_育儿这样做,宝宝更聪明,简单又实用的家庭感统训练游戏推荐...
  3. 中软国际云专业服务获双冠王,IDC排名火热出炉
  4. C/C++ 病毒破坏手法总结
  5. web自动化之trigger()常用鼠标操作事件
  6. javascript面向对象(三):class语法详解
  7. 简历石沉大海?程序员简历到底该怎么写?
  8. mysql 主从ppt_mysql主从配置
  9. 使用map_server保存并使用已有地图
  10. 北京地铁21号线_北京迎来地铁大动脉,设有21站,全为地下线,沿线市民幸运了...