我感到困惑的是,微软说InterlockedExchange需要内存对齐,但是英特尔的文档说锁不需要内存对齐。我是不是漏掉了什么,什么的?谢谢
来自Microsoft库的
Platform : DLLs、进程和线程InterlockedExchange
目标参数所指向的变量必须在32位边界上对齐;否则,该函数将在多处理器x86系统和任何非x86系统上不可预测地运行。
来自英特尔软件开发人员手册的;
发布于 2009-06-16 20:12:30
从前,微软在x86以外的处理器上支持x86,例如MIPS、PowerPC和Alpha。这些处理器都需要对它们的互锁指令进行对齐,因此Microsoft将需求放在规范中,以确保这些原语能够移植到不同的体系结构中。
发布于 2009-05-21 08:50:26
尽管锁前缀不需要对齐内存,而且可能用于实现InterlockedExchange()的cmpxchg操作不需要对齐,但如果操作系统启用了对齐检查,cmpxchg将在使用未对齐操作数执行时引发对齐检查异常(AC)。查看cmpxchg和类似的文档,查看保护模式异常列表。我不确定Windows是否支持对齐检查,但这并不让我感到惊讶。
发布于 2009-05-29 10:58:39
嘿,我回答了一些有关这方面的问题,也要记住;
我几乎忘了,从英特尔的TBB,他们有加载/存储8位的定义w/o使用隐式或显式锁定(在某些情况下);
.code
ALIGN 4
PUBLIC c __TBB_machine_load8
__TBB_machine_Load8:
; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.
mov ecx,4[esp]
test ecx,7
jne load_slow
; Load within a cache line
sub esp,12
fild qword ptr [ecx]
fistp qword ptr [esp]
mov eax,[esp]
mov edx,4[esp]
add esp,12
ret
EXTRN __TBB_machine_store8_slow:PROC
.code
ALIGN 4
PUBLIC c __TBB_machine_store8
__TBB_machine_Store8:
; If location is on stack, compiler may have failed to align it correctly, so we do dynamic check.
mov ecx,4[esp]
test ecx,7
jne __TBB_machine_store8_slow ;; tail call to tbb_misc.cpp
fild qword ptr 8[esp]
fistp qword ptr [ecx]
ret
end总之,希望这能帮你弄清楚一些事情。
https://stackoverflow.com/questions/881820
复制相似问题