阅读有关 InterlockedIncrement 的功能时我看到传递的变量必须在32位边界上对齐。通常我见过使用InterlockedIncrement的代码,如下所示:

class A
{
 public:
   A();
   void f();

 private:
  volatile long m_count;
};

A::A() : m_count(0)
{
}

void A::f()
{
  ::InterlockedIncrement(&m_count);
}

上述代码在多处理器系统中是否正常工作,还是应该更加关注?

有帮助吗?

解决方案

这取决于您的编译器设置。但是,默认情况下,任何八个字节及以下的内容都将在自然边界上对齐。因此,“int”表示“int”。我们在32位边界上对齐。

此外,“#pragma pack”指令可用于更改编译单元内的对齐。

我想补充一点,答案假设是Microsoft C / C ++编译器。打包规则可能因编译器而异。但总的来说,我会假设大多数Windows的C / C ++编译器使用相同的打包默认值,只是为了更轻松地使用Microsoft SDK标题。

其他提示

代码看起来很好(变量将正确对齐,除非你专门做一些事情来打破它 - 通常涉及强制转换或'压缩'结构)。

是的,这样可以正常使用。除非另有说明,否则编译器通常会对齐。

严格来说,这实际上取决于您对A的使用 - 例如,如果您打包“A”, shell ITEMIDLIST中的对象,或者带有错误“pragma pack”的结构。数据可能没有正确对齐。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top