InterlockedCompareExchange - 确切的对齐要求是什么以及如何强制执行
InterlockedCompareExchange - what are the exact alignment requirements and how can they be enforced?
我无法理解 MSDN 文档对互锁变量访问系列函数的含义。我使用InterlockedExchange进行设置,并使用InterlockedCompareExchange来获取由多个线程使用的成员变量。
该成员位于 1 字节打包的类中:
#pragma pack(1)
class MyClass {
char _;
long m_MyMember;
// ...
}
所以成员由
InterlockedExchange(&m_MyMember, 1);
并得到了
long value = InterlockedCompareExchange(&m_MyMember, 0, 0);
InterlockedExchange 文档不会以任何方式提及对齐(Strg+F "align"(,但 InterlockedCompareExchange 确实:
此函数的参数必须在 32 位边界上对齐;否则,该函数在多处理器 x86 系统和任何非 x86 系统上的行为将不可预测。
但是,据我了解,参数都是堆栈变量,因为可以重写上面的调用
long *ptr = &m_MyMember;
long zero = 0;
long value = InterlockedCompareExchange(ptr, zero, zero);
所以我们有块本地自动存储类变量。所有 4 字节完全对齐,无论m_MyMember驻留在哪个类中。当然,我认为这是错误的,这意味着ptr后面的地址必须在4字节边界上对齐。
所以我的问题是:
- 互锁交换真的是对齐不可知的,还是文档中的放行?
- 您能否确认不是字面上的参数,而是 long* 后面的地址必须与 4 字节对齐(我不能假设其他参数如何不能与 4 字节对齐,因为它们是堆栈变量(?
- 如果 2 的答案是肯定的:如何解决这个问题?更改周围类的对齐方式不是一种选择,c++ 11 原子或 boost 也不是一种选择(所有这些都是由于公司限制和 msvc10 到 msvc14 所需的可编译性(。
我考虑过声明m_MyMember易失性并使用关键部分来访问它。虽然我希望最好根据需要正确声明m_MyMember对齐,因为这些互锁变量访问函数都围绕给定的代码库,我不想为每个变量添加额外的配套 CS。
限制不是真正的Microsoft,而是硬件。 为了原子地改变东西,它必须对齐(指针(。
对于关键部分或 STD::atomic 的成员也是如此。
在不重新对齐类的情况下,如果可以interlock
变量来保证与类的 4 字节对齐,那么这应该可以工作
相关文章:
- 指针类型类成员的动态强制转换的恒定性是什么?
- 在只读(即 const)访问器上执行结构化绑定的最佳实践是什么?
- 在 c++ 中从执行的 shell 命令获取返回状态的安全方法是什么?
- 是什么将程序集转换为实际可执行的材料
- 在高通六边形处理器的word32上执行水平求和的最快方法是什么
- 统一初始化是隐式发生的,即使 int 强制转换运算符是使用 explicit 关键字声明的.原因是什么?
- 在 MySQL 连接器C++ API 中使用一个函数调用执行多个查询的正确方法是什么?
- 抛出多个异常时,catch 块执行的顺序是什么,为什么?
- 在CUDA中使用小M的两个MXN矩阵执行矢量点产品的最快方法是什么?
- 将强制转换运算符重载到 std::map 的正确语法是什么
- 如果默认构造函数不执行任何操作,则目的是什么
- 是什么导致程序在我继续执行另一个功能之前停止
- 执行随机开关函数的QT方式是什么连续两次使用相同情况的方法
- 执行三个嵌套for循环的最快方法是什么
- 在转换为较小的数值类型之前执行范围检查的安全、跨平台方法是什么
- C++代码的执行流程是什么
- 当我们说在执行程序时将操作系统的控制权传递给main()函数时,我们的意思是什么
- 将绝对地址强制转换为指针变量的现代C++方法是什么?
- InterlockedCompareExchange - 确切的对齐要求是什么以及如何强制执行
- Eclipse的代码标准(而不是样式)强制执行器