Serialization IA-32 |多处理器环境中的重新排序问题
我想在IA-32上执行原子“和”操作Serialization IA-32 |多处理器环境中的重新排序问题,serialization,assembly,x86,Serialization,Assembly,X86,我想在IA-32上执行原子“和”操作 请考虑以下情况: ; processor 0 lea edx, var mov ecx, mask mov eax, [edx] lock and [edx], ecx ; processor 1 lea edx, var mov eax, 0xff xchg [edx], eax 我不确定处理器1对“var”的存储是否可能在加载和处理器0对“var”的存储之间发生。 那么,这是有效的还是我需要像这样旋转锁: ; processor
请考虑以下情况:
; processor 0
lea edx, var
mov ecx, mask
mov eax, [edx]
lock and [edx], ecx
; processor 1
lea edx, var
mov eax, 0xff
xchg [edx], eax
我不确定处理器1对“var”的存储是否可能在加载和处理器0对“var”的存储之间发生。
那么,这是有效的还是我需要像这样旋转锁:
; processor 0
push ebx
lea edx, var
mov ecx, mask
@@loop:
mov ebx, [edx]
mov eax, ebx
and eax, ecx
lock cmpxchg [edx], eax
cmp eax, ebx
jne @@loop
pop ebx
谢谢你的回答。致以最良好的祝愿
编辑:
换言之:
我想在“处理器0”中执行连接,需要获取初始值。引用内存的xchg会自动锁定总线(或在数据已在缓存中时锁定缓存)。见第8.3.1条。(警告:我最近没怎么看,但英特尔过去经常重新安排他们的网站,相当快地使链接失效。如果是这样,谷歌搜索“英特尔参考3a”之类的东西应该会打开它)。我已经一遍又一遍地读了《系统编程指南3a:第8.3节》,但尤其是上面的情况我并不完全清楚。顺便说一句,这根本不是关于原子性,而是关于指令顺序。@FrEEzE2046:对不起,我倒读了一些东西,还以为你在问另一个存储是否会发生在
xchg
中隐含的加载和存储之间。您是说和[edx],ecx
中隐含的信用证吗?让我们假设var的初始值为'31',mask为'15'处理器0'正在从var的地址(mov eax,[edx])加载。紧接着,他正在执行读-修改-写连接(lock和[edx],ecx)。但,可能同时,“处理器1”也在对该内存位置(mov eax,0xff,xchg[edx],eax)执行写操作。现在我不确定,如果保证我在'Procesor 0'中存储到eax-寄存器的值与我执行连接的值相同。我需要确定,因为我使用这个值作为结果,它应该是预期的。