InterlockedIncrement用法

时间:2009-03-05 17:09:43

标签: c++ multithreading winapi multicore interlocked

在阅读函数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);
}

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

4 个答案:

答案 0 :(得分:15)

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

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

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

答案 1 :(得分:0)

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

答案 2 :(得分:0)

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

答案 3 :(得分:0)

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