gpt4 book ai didi

c++ - 静态初始化不安全调用的线程安全

转载 作者:搜寻专家 更新时间:2023-10-31 00:55:46 29 4
gpt4 key购买 nike

在图书馆的某个地方我有一个函数,看起来像 -

inline int getIword()
{
static int i = std::ios_base::xalloc();
return i;
}

现在您可以阅读有关 std::ios_base::xalloc() 调用 here 的信息,但我想从提到的链接中强调这一行 -

This function is thread-safe; concurrent access by multiple threads does not result in a data race. (since C++14)

它说“自 C++14 起”,但我也需要 C++11 支持。由于函数调用实际上是在初始化 getIword() 方法的静态局部变量,我们知道 local static variable initialization is thread safe对于 C++11 代码,假设这段代码是安全的吗?

  • 如果仅对功能进行后续读取调用,则安全,例如。 auto something = getIword()

  • 安全吗?对于如下所示的代码:

...

operator<<(std::ostream &os, T const value)
{
if (value == ...) {
os.iword(getIword()) = 1;
} else if (value == ...) {
os.iword(getIword()) = 0;
}
return os;
}

...

如果在后面的例子中它是不安全的,我应该把 lock_guards 放在哪里以使其对 C++11 安全?围绕 return i 或整个方法或在哪里进行调用?

最佳答案

静态局部变量初始化是线程安全的,因为如果多个线程调用该函数,那么只有其中一个会真正初始化变量。它不保护您初始化的东西。这意味着在这种情况下,如果您有两个不同的线程,一个调用 getIword,另一个调用另一个函数,该函数也恰好调用 std::ios_base::xalloc()同时这两个调用将不会同步,您将有一个数据竞争,这又是未定义的行为。

关于c++ - 静态初始化不安全调用的线程安全,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41294677/

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