glog 学习笔记(2)

本文介绍了glog中Mutex的实现,它支持动态初始化,能在main()调用前的全局构造函数中使用。Mutex解决了全局变量初始化顺序不确定的问题,特别是在存在依赖关系时。文章详细阐述了如何通过成员变量is_safe_确保Lock()和Unlock()在未初始化时也能正确运行,避免了多线程环境下不必要的操作。
摘要由CSDN通过智能技术生成

glog 中有一个 Mutex 的简单封装(仅供内部使用,代码见 ./src/base/mutext.h)。其实按道理 mutex 封装是一个非常常见以及非常简单的 class,我相信任何有一定多线程开发经验的 cpp-er 都应该自己写过这个轮子。但是,glog 中这个 mutex 确提供了一个不同寻常的特性:支持 dynamic-initialization (即在 main() 调用前的全局构造函数中使用)。

首先这里先简单解释下 Mutex 其要解决的场景:

我们知道,因为 c++ 中构造函数的存在,让一些全局变量,或者 static 变量可以在 main() 调用前干很多事情。但是对于两个全局变量,其之间的初始化顺序是无法保证的,比如 :

// 文件 foo.h
extern MyFoo g_foo;
// 文件 foo.cc
MyFoo g_foo;

// 文件 bar.h
extern MyBar g_bar;
// 文件 bar.cc
MyBar g_bar;

上述两个全局变量本身并没有依赖关系,所以我们其实并不关心那个变量先完成初始化。但是随着系统越来越复杂,难免会有一些全局变量之间存在依赖,即 比如 g_foo 是要依赖于 g_bar 先构造完成,这时候,我们就需要想其他办法来解决这个问题了(往往通过局部静态单例来解决)。

那么,如果我们的全局 Mutex 变量,被另外若干个全局变量依赖(要在其上调用 Lock() 和 Unlock(),别问我为什么会有这么奇怪的需求),那么我们就必须保证这个全局 Mutex 即使在没有调用构造函数前,其 Lock() 和 Unlock() 也可以完美运行。好了现在有请我们本文的主角:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值