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

标签 visual-studio-2012 visual-studio-2015 c++-cli

我正在移植在 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/

相关文章:

c++ - 如何在 visual studio 2015 中更改条件断点上的变量值

c++ cli try block 不允许文件流打开大文件

c++-cli - C++/CLI 等效于 C#'s ' readonly' 关键字

c++ - 将初始化列表作为 VS12 中 vector 的函数参数传递时出现语法错误

c# - 将 .net 类库移植到 Windows 应用商店应用程序类库

visual-studio-2012 - 如何使Visual Studio 2012正确呈现等宽字体?

c# - 检查时间范围是否在 C# 中相交

visual-studio-2015 - 无法识别术语 "Add-Migration"

安装 VS 2015 后 Windows 10 在启动时卡住

c++ - 内存泄漏、大量位图图像 C++ CLI