微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

我无法理解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] 举报,一经查实,本站将立刻删除。

相关推荐