我无法理解MSDN文档对联锁variables访问系列函数的影响。 我使用InterlockedExchange进行设置,并使用InterlockedCompareExchange获取multithreading使用的成员variables。
成员在一个1字节的打包类中:
#pragma pack(1) class MyClass { char _; long m_MyMember; // ... }
所以这个成员是由…设置的
InterlockedExchange(&m_MyMember,1);
并得到了
如果没有Visual Studio,可以用C ++开发windows吗?
用Visual Studio 2010构buildLinux内核
试图在32位窗口上运行64位testing
签署检查NaN值
Visual Studio或Eclipse – 哪一个更适合Windows上的Qt?
long value = InterlockedCompareExchange(&m_MyMember,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。
所以我的问题是:
InterlockedExchange确实alignment不可知或者这是一个放在文档?
你可以确认,不是字面上的参数,但长*背后的地址必须是4字节alignment(我不能假设其他参数不能如何4字节alignment,因为他们是堆栈variables)?
如果对2的回答是肯定的,那怎么解决呢? 更改周围类的alignment不是一个选项,既不是c ++ 11primefaces或提升(全部由于公司的限制和msvc10到msvc14所需的可编译性)。
我考虑声明m_MyMember易失性,并使用关键部分来访问它。 虽然我希望最好正确地声明m_MyMember按需要alignment,因为这些互锁variables访问函数都在给定的代码基础上,我不想为每个variables添加一个额外的伴随CS。
init_seg和从库代码警告C4073?
发布模式VS MS Visual Studio Windows中的DEbug模式
如何运行没有Visual Studio的Windows Phone 8模拟器?
Visual Studio 2012:从现有源代码创build项目
如何build立对Windows 8.1 SDK
限制不是微软的,而是硬件。 为了原子地改变东西,它必须被对齐(指针)。
对于关键部分的成员也是如此,或STD :: atomic
如果没有重新对齐类,如果你可以通过interlock变量来保证与类的4字节对齐,那么应该可以工作
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。