【发布时间】:2013-01-28 22:03:55
【问题描述】:
在 Windows 下,有 3 个编译器内部函数来实现内存屏障:
1. _ReadBarrier;
2. _WriteBarrier;
3. _ReadWriteBarrier;
但是,我发现了一个奇怪的问题:_ReadBarrier 似乎是一个什么都不做的虚拟函数!以下是我用VC++ 2012生成的汇编代码。
我的问题是:如何在汇编指令中实现内存屏障功能?
int main()
{
013EEE10 push ebp
013EEE11 mov ebp,esp
013EEE13 sub esp,0CCh
013EEE19 push ebx
013EEE1A push esi
013EEE1B push edi
013EEE1C lea edi,[ebp-0CCh]
013EEE22 mov ecx,33h
013EEE27 mov eax,0CCCCCCCCh
013EEE2C rep stos dword ptr es:[edi]
int n = 0;
013EEE2E mov dword ptr [n],0
n = n + 1;
013EEE35 mov eax,dword ptr [n]
013EEE38 add eax,1
013EEE3B mov dword ptr [n],eax
_ReadBarrier();
n = n + 1;
013EEE3E mov eax,dword ptr [n]
013EEE41 add eax,1
013EEE44 mov dword ptr [n],eax
}
013EEE56 xor eax,eax
013EEE58 pop edi
013EEE59 pop esi
013EEE5A pop ebx
013EEE5B add esp,0CCh
013EEE61 cmp ebp,esp
013EEE63 call __RTC_CheckEsp (013EC3B0h)
013EEE68 mov esp,ebp
013EEE6A pop ebp
013EEE6B ret
【问题讨论】:
-
在 x86 上,所有加载都是获取,所有存储都是发布,因此您不需要任何显式代码。唯一必要的代码是完整的屏障。读屏障的概念比 x86 架构更通用,并且在内存模型较弱的机器上并不重要。
-
我猜这些只是改变编译器生成代码方式的编译器障碍,而不是汇编级障碍。
-
@KerrekSB 这是真的吗,即使对于最新的机器?这样做会大大减慢速度,并消除拥有多个内核的许多效用(至少对于某些类型的应用程序而言)。
-
@JamesKanze:嗯,至少据我所知。不过,我完全有可能搞错了。
-
对linux内核smpkernel.org/doc/Documentation/memory-barriers.txt987654321@的一个很好的解释
标签: c++ c assembly execution instructions