多线程如何优雅地初始化全局变量?
2021-06-19 05:05
标签:否则 疑问 amp ali int 为什么 线程安全 .cpp none 如果使用多线程,那么几乎都会用到全局变量,这时初始化全局变量的技巧就很重要了。 通常初始化全局变量时就是像下面这样的,先判断是否已经初始化过了,然后才去初始化。在单线程场景下,lazy初始化(就是用到时才初始化)一般是下面这样写的,这没问题。但是多线程场景下就不能这样写了,我们要先给 POSIX提供了一个函数 编译 你可能有疑问,为什么不能在创建线程之前就初始化全局变量?那样的话不需要考虑什么线程安全。确实是的,但是如果有很多个全局变量呢(比如数组)?进程起来的时候就费很长时间去执行初始化的逻辑,太耗时间了,何不如选择Lazy初始化。 多线程如何优雅地初始化全局变量? 标签:否则 疑问 amp ali int 为什么 线程安全 .cpp none 原文地址:https://www.cnblogs.com/xcw0754/p/9690718.html需求场景
random_is_initialized
创建一个mutex
,否则这段代码就问题大了。但是mutex
也得初始化吧?初始化又要创建一个mutex
来保证前一个mutex
能正常初始化,这就陷入死循环了。static int random_is_initialized = 0;
extern int initialize_random(); // 这个函数用来初始化全局变量
int random_function()
{
if (random_is_initialized == 0) {
initialize_random();
random_is_initialized = 1;
}
... /* Operations performed after initialization. */
}
pthread_once
,很适合解决这种问题。它能保证只初始化一次全局变量,而且线程安全,开发起来就很方便了。使用方法参考下面的实现。实现
#include
gcc -o test test.cpp -lpthread
参考
https://linux.die.net/man/3/pthread_once