gpt4 book ai didi

c - 通过函数调用进行的静态初始化在 C 中是线程安全的吗?

转载 作者:行者123 更新时间:2023-12-04 09:15:45 24 4
gpt4 key购买 nike

想象一下:

void *ImCalledByThreads (/*...*/)
{
//some stuff
static typePlaceholder AmIThreadSafe = QuestionTag();
//other stuff
}

这个初始化线程安全吗?

即使 QuestionTag() 是线程安全的,如果第一个线程运行该函数而另一个线程调用此行,会发生什么情况。是否会检测到该功能只会执行一次?或者这只是多线程的一个坏主意?

最佳答案

这不是合法的 C 代码,因为 C 要求静态变量的初始值设定项是编译时常量。因此,初始化可以在程序加载时发生,在任何线程有机会启动之前,因此那里不会存在竞争条件。

来自 C99 §6.7.8/4:

All the expressions in an initializer for an object that has static storage duration shall be constant expressions or string literals.

Visual Studio 可能允许将非常量作为非标准扩展,但就此而言,所有赌注都不成立。检查它的文档和/或其生成的汇编代码,看看它是否是线程安全的。

对于允许使用非常量初始化器的 C++,请参阅问题 Is initialization of local static function-object thread-safe? .简短回答:是的,在 C++11 中,在 C++03 和更早的版本中没有(在标准中没有提到线程),尽管编译器仍然可以选择线程安全。

关于c - 通过函数调用进行的静态初始化在 C 中是线程安全的吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20670007/

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