我正在移植在 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 会出现这种行为变化。
最佳答案
顾名思义,InterlockedIncrement64
是 LONGLONG
的原子增量操作, 并且需要内存为 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/