InterlockedCompareExchange – 确切的alignment要求是什么,他们如何执行?

我无法理解MSDN文档对联锁variables访问系列函数的影响。 我使用InterlockedExchange进行设置,并使用InterlockedCompareExchange获取multithreading使用的成员variables。

成员在一个1字节的打包类中:

#pragma pack(1) class MyClass { char _; long m_MyMember; // ... } 

所以这个成员是由…设置的

 InterlockedExchange(&m_MyMember, 1); 

并得到了

 long value = InterlockedCompareExchange(&m_MyMember, 0, 0); 

InterlockedExchange文档不会以任何方式引用alignment(Strg + F“alignment”) ,但是InterlockedCompareExchange可以:

该函数的参数必须在32位边界上alignment; 否则,该function在多处理器x86系统和任何非x86系统上将performance不可预知。

但是,据我所知, 参数是所有堆栈variables,因为可以重写上述调用

 long *ptr = &m_MyMember; long zero = 0; long value = InterlockedCompareExchange(ptr, zero, zero); 

所以我们有阻止本地自动存储类的variables。 所有完美的4字节alignment,无论类m_MyMember驻留在哪里 。当然,我认为这是错误的,这意味着ptr后面的地址必须在4字节边界上alignment。

所以我的问题是:

  1. InterlockedExchange确实alignment不可知或者这是一个放在文档?
  2. 你可以确认,不是字面上的参数,但长*背后的地址必须是4字节alignment(我不能假设其他参数不能如何4字节alignment,因为他们是堆栈variables)?
  3. 如果对2的回答是肯定的,那怎么解决呢? 更改周围类的alignment不是一个选项,既不是c ++ 11primefaces或提升(全部由于公司的限制和msvc10到msvc14所需的可编译性)。

我考虑声明m_MyMember易失性,并使用关键部分来访问它。 虽然我希望最好正确地声明m_MyMember按需要alignment,因为这些互锁variables访问函数都在给定的代码基础上,我不想为每个variables添加一个额外的伴随CS。

限制不是微软的,而是硬件。 为了原子地改变东西,它必须被对齐(指针)。

对于关键部分的成员也是如此,或STD :: atomic

如果没有重新对齐类,如果你可以通过interlock变量来保证与类的4字节对齐,那么应该可以工作