想请大家能帮我解释一段代码!(50分)

  • 主题发起人 主题发起人 hellotao
  • 开始时间 开始时间
H

hellotao

Unregistered / Unconfirmed
GUEST, unregistred user!
功能是寻找当前线程的最大值加一, 我想应该是的吧
{ Thread safe increment of Numbers to guarantee the result is unique }

function GetUniqueNumber: Integer;
asm
@@1: MOV EDX,1
XCHG Guard,EDX
OR EDX,EDX
JNZ @@2
MOV EAX,Numbers
INC EAX
MOV Numbers,EAX
MOV Guard,EDX
RET
@@2: PUSH 0
CALL Sleep
JMP @@1
end;
 
其实这函数一点也不保险,多线程、单cpu下都没保证
用 InterlockedExchangeAdd 吧,多线程、多cpu都可以(多cpu的话要求变量32位地址对齐)
 

最好能逐行解释 !
 
function GetUniqueNumber: Integer;
asm
@@1: MOV EDX,1
XCHG Guard,EDX ;在Guard设置1,edx得到Guard的值,1表示我现在占用
OR EDX,EDX
JNZ @@2 ;检查edx(就是guard的原值)是不是非0,非0则跳转到@@2,等待
MOV EAX,Numbers
INC EAX
MOV Numbers,EAX ;就是Numbers=Numbers+1,并且,这个值在eax,返回值就是通过eax的,所以这个值是函数的返回值
MOV Guard,EDX ;设置Guard为0,开放给其他人用
RET
@@2: PUSH 0
CALL Sleep ;就是Sleep(0)
JMP @@1 ;别人在用,等待一下再试
end;

 
接受答案了.
 
后退
顶部