gpt4 book ai didi

c++ - 如何解决用于在 C++ 中维护静态局部变量的服务数据的线程安全问题?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:27:13 27 4
gpt4 key购买 nike

考虑以下场景。我们有一个带有静态局部变量的 C++ 函数:

void function()
{
static int variable = obtain();
//blahblablah
}

该函数需要从多个线程并发调用,所以我们添加一个临界区以避免并发访问静态本地:

void functionThreadSafe()
{
CriticalSectionLockClass lock( criticalSection );
static int variable = obtain();
//blahblablah
}

但这就足够了吗?我的意思是有一些魔法可以使变量只被初始化一次。因此,运行时维护了一些服务数据,指示每个静态本地是否已经初始化。

上述代码中的关键部分是否也会保护该服务数据?这种情况需要任何额外的保护吗?

最佳答案

C++ 说你的静态变量应该只初始化一次 - 然而 C++ 不处理线程(还)。

gcc(至少在 *nix 系统上)使用适当的魔法来安全地保护初始化此类静态变量的多个线程。根据this link , msvc 不会 - 在这种情况下,您必须自己锁定初始化。

用关键部分保护初始化应该保护所有这些 - 即你的 functionThreadSafe() 没问题 - (除非 obtain() 本身调用 functionThreadSafe()

This blog article在这方面值得一读。

就个人而言,为了避免意外,我会尝试重写它,以便您可以在创建任何线程之前自己初始化一次 variable - 例如

static int variable = 0;
void init_variable() //call this once, at the start of main()
{
variable = obtain();
}

void function()
{
//use variable, lock if you write to it
}

关于c++ - 如何解决用于在 C++ 中维护静态局部变量的服务数据的线程安全问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2955797/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com