gpt4 book ai didi

函数内的 C++ 多线程静态 POD 初始化

转载 作者:行者123 更新时间:2023-11-30 05:13:35 24 4
gpt4 key购买 nike

如果静态 POD 是被多个线程调用的函数中的静态变量,我不确定它们是否实际上可能被多次初始化为零:

void CalledByManyThreads()
{
struct StaticClass
{
struct POD { volatile LONG value; } pod; // Using MSVC specific volatile behaviour - I don't care about std::atomic


StaticClass() // Constructor makes the struct a non-POD so we likely need the extra POD struct for our member data
{
while (pod.value == 0)
if (InterlockedCompareExchange(&pod.value, 0, 1) == 0)
{
// Is it possible that another thread zero initialises pod after we have just set it to 1?
break;
}
}
};


static StaticClass test; // When is test.pod zero initialised in MSVC 2013+?
}

围绕这一功能领域,强制性 C++ 标准与编译器的实际行为之间存在差异 - 我对 MSVC2013 之后的现有编译器的实际情况更感兴趣。

是否有可能一个线程将 pod.value 设置为 1,但在另一个竞争线程零之后将其初始化回 0?

最佳答案

MSVC 2013 不支持“魔术静力学”MSDN : C++11 support .我之前也验证过生成的代码,并确认它不支持它们。

VS2015 似乎可以正常工作(并被标记为如此)。

VS2013生成的代码和早期的代码一样,都有线程不安全的机制来检测变量是否已经构造。这是必要的。这个测试+构建对象的时间就是比赛发生的时间长度。

在一个项目被完全构建之后,没有进一步的重建。

我在 VS2013 中发现了很多编译器问题(例如,当在 VM 中运行时,运行时库中 AVX 命令的错误检测),Microsoft 已建议针对任何发现的问题升级编译器。 Microsoft connect : AVX generates illegal instruction

这是我给你的建议。

Is it possible that one thread sets pod.value to 1 but that after another competing thread zero initialises it back to 0?

编译器有 3 个计划来初始化程序中的静态数据。

  • 非常静态的数据
  • 静态数据
  • 非 pod 数据。

非常静态的数据

当编译器看到一个在编译时可以完全知道的数据结构时,它将在 obj 文件中为该结构创建内存,这将具有最终文件的正确布局。这不会被多次初始化。

静态数据

如果 POD 结构正在使用编译时不完全已知的信息进行初始化,那么将为未知元素创建一个构造函数。在我已经确定的情况下

struct memoryAllocator {
void * (*mallocFunction)( size_t size );
int initialized;
}

memoryAllocator alloc { malloc, 1 };

alloc是用initialized set为1作为静态数据初始化的,然后用导入的malloc的值在main之前构造。似乎没有 C++ 要求对象的构造是全有或全无。这对我来说似乎是一个疏忽。

非 pod 数据

这是作为构造函数初始化的。在静态函数中,代码由描述初始化是否已完成的变量保护。

通过查看您的代码,您有

  1. 没有初始化POD结构中的数据
  2. 未编写 value 能够从 1 转换为 0 的代码。

在这个术语中,我希望 POD 数据保持未初始化和 0(因为它是静态的),并且构造函数是唯一要调用的项目,并且会将数据修改一次为 1(由于互锁)。

关于函数内的 C++ 多线程静态 POD 初始化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43884968/

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