InterlockedIncrement用法

Nav*_*een 9 c++ winapi multithreading 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);
}
Run Code Online (Sandbox Code Playgroud)

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

Tor*_*ack 15

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

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

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