MySQL中的互斥锁包装器
程序员文章站
2024-01-09 17:53:58
...
我们习惯性的使用互斥锁来保护某个临界区,它可能是一个变量,或者一段代码,比如在进入某个函数后,需要对mutex加锁,而无论任何情况下,只要函数退出,就要把锁释放掉,而函数可能会因为各种情况而退出,包括遇到各种异常,错误,不同的结果等等,一个可行的方案是在所有可能退出函数的地方进行锁的释放,亦或者通过goto/break等语法来控制函数在特定的位置退出,并且退出前进行锁的释放,但这些实现方式相比较今天要说的互斥锁包装器来说,没那么优雅,下面看下MySQL是如何使用互斥锁包装器的。
在MySQL中,通过Mutex_lock这个类来实现对mutex锁的简单封装,代码非常简练,只有十几行,如下:
class Mutex_lock
{
public:
explicit Mutex_lock(mysql_mutex_t *mutex) : m_mutex(mutex)
{
if (m_mutex)
mysql_mutex_lock(m_mutex);
}
~Mutex_lock()
{
if (m_mutex)
mysql_mutex_unlock(m_mutex);
}
private:
mysql_mutex_t *m_mutex;
Mutex_lock(const Mutex_lock&); /* Not copyable. */
void operator=(const Mutex_lock&); /* Not assignable. */
};
Mutex_lock类将拷贝构造函数和赋值函数设置为private类型,来避免实例通过这种方式被复制。
Mutex_lock的原理就是在局部变量离开当前作用域时,会被自动析构,而析构函数中调用解锁函数。
MySQL中也有很多地方利用Mutex_lock来实现代码作用域的锁控制,比如
int add_status_vars(const SHOW_VAR *list)
{
Mutex_lock lock(status_vars_inited ?