gpt4 book ai didi

visual-studio-2012 - InterlockedIncrement64 与托管 C++

转载 作者:行者123 更新时间:2023-12-04 19:42:51 28 4
gpt4 key购买 nike

我正在移植在 Visual Studio 2012 下编写的代码以使用 Visual Studio 2015 进行编译。代码在 Windows 2012 上构建正常。

我有一些调用 InterlockedIncrement64 的代码的问题.对于 x64 目标,它构建正常,但在目标是 Win32 并且调用代码被管理(即使用 /clr 编译)时失败,产生:

error C3861: 'InterlockedIncrement64': identifier not found



看winnt.h,好像 InterlockedIncrement64当目标是 Win32 和 _MANAGED 时未定义被定义为。

我可以重新排列代码,使得 InterlockedIncrement64不需要托管代码,但我仍然很想知道为什么 Visual Studio 2015 会出现这种行为变化。

最佳答案

顾名思义,InterlockedIncrement64LONGLONG 的原子增量操作, 并且需要内存为 64 位 对齐 .

鉴于 您不能在托管代码中设置内存对齐 并且它可以用于托管类成员,那么这个限制是有道理的(对我来说):“……否则,这个函数在多处理器 x86 系统和任何非 x86 系统上的行为将不可预测。”。想一想:

::InterlockedIncrement64(&_memberVariable);

_memberVariable在托管世界中分配,那么它不会是 64 位对齐的(尽管它可能是偶然发生的),并且 对于 Win32,此代码将始终失败 .当 _MANAGED 时删除此功能更简单被定义为。

解决方法 : 检查 #ifdef _MANAGED并调用 Interlocked::Increment相反,或删除原子性(!)但在增量后包含内存屏障。

关于visual-studio-2012 - InterlockedIncrement64 与托管 C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37549166/

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