我无法理解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。
所以我的问题是:
我考虑声明m_MyMember易失性,并使用关键部分来访问它。 虽然我希望最好正确地声明m_MyMember按需要alignment,因为这些互锁variables访问函数都在给定的代码基础上,我不想为每个variables添加一个额外的伴随CS。
限制不是微软的,而是硬件。 为了原子地改变东西,它必须被对齐(指针)。
对于关键部分的成员也是如此,或STD :: atomic
如果没有重新对齐类,如果你可以通过interlock
变量来保证与类的4字节对齐,那么应该可以工作