本文共 1920 字,大约阅读时间需要 6 分钟。
最近在看InnoDB关于mutex定义部分的代码,由于之前一直工作在MySQL5.6版本里,发现从5.7开始到8.0,这部分代码已经完全进行了重构,本文主要简单记录下新款latch的定义和使用方式。主要记录下涉及的函数和类,不做具体的深入
首先mutex的定义分为三个部分:
PolicyMutex:定义了mutex的接口,包括
enter();exit();try_lock();init();...
PolicyMutex私有成员m_impl,通过模板实例化为具体的实现方式:
TTASFutexMutexFutexMutexTTASFutexMutex BlockFutexMutexTTASMutex SpinMutexTTASMutex BlockSpinMutexOSTrackMutex SysMutexOSTrackMutex BlockSysMutexTTASEventMutex SyncArrayMutexTTASEventMutex BlockSyncArrayMutex
可以看到,这里定义了4种Mutex,两种policy,前者是Mutex的具体实现,后者用于跟踪mutex的counter信息
4种mutex包括:
TTASFutexMutex:
syscall(SYS_futex, &m_lock_word, FUTEX_WAIT_PRIVATE, MUTEX_STATE_WAITERS, 0, 0, 0);//原子检查m_Lock_word是否为MUTEX_STATE_WAITERS, 如果是,则休眠
syscall(SYS_futex, &m_lock_word, FUTEX_WAKE_PRIVATE, 1, 0, 0, 0);
futex运行于用户态, 是fast usetablespace mutex的缩写, 对于冲突较小的互斥锁,运行于用户态可以减少内核层切换的开销,futex说明
TTASMutex:
TTASEventMutex
OSTrackMutex:
两种Policy
LatchMeta:
latch_meta_t
, 其中LatchMeta维护了锁的id, latch level等信息;CreateTracker:
我们知道,在debug模式下,innodb还实现了一套机制,也就是通过sync level, 来判断是否违背了加锁顺序,如果有的话,在debug模式下会assert,提示有潜在的deadlock风险
这里涉及到三个类:
LatchDebug
类做进一步的判断转载地址:http://mckia.baihongyu.com/