我正在试验 FASM 以提高我对并发性的理解。我创建了一个程序,它有两个线程,每个线程都产生一定数量的lock xadd
. 我在 i7 上的 Win7 64bit 上运行它,我得到了非常有趣的结果。虽然程序本身可以正常工作,但它加载了 4 个内核而不是我预期的两个内核。
任务管理器的“性能”显示清晰的 4 核负载
资源监视器的 CPU 选项卡显示我的进程有两个线程
有人可以提示为什么会发生这种情况吗?有没有办法判断哪个内核当前正在运行我的 FASM 程序中的一段代码(只是为了确保内核确实不同)?
format PE console
include 'win32ax.inc'
include 'macro32.inc'
entry main
section '.code' code readable executable
main:
invoke CreateThread, 0, 0, atomic_inc, 0, 0, 0
mov [threadHandle], eax
call atomic_inc
invoke WaitForSingleObject, dword[threadHandle], 0xFFFFFFFF
;cinvoke printf, "B - %u", dword [myInt]
invoke system, halt
invoke exit, 0
proc atomic_inc, lpParam
mov ebx, 1000000000
startloop:
cmp ebx, 0
jz endofloop
push ebx
; Loop body
mov eax, 1
lock
xadd dword [myInt], eax
pop ebx
dec ebx
jmp startloop
endofloop:
ret
endp
section '.data' data readable writable
halt db "pause>null",0
myInt dd 0
threadHandle dd 0
section '.idata' import data readable
library msvcrt, 'msvcrt.dll',\
kernel, 'KERNEL32.DLL'
import msvcrt,\
system, 'system',\
printf, 'printf',\
exit, 'exit'
import kernel,\
CreateThread, 'CreateThread',\
WaitForSingleObject, 'WaitForSingleObject',\
Sleep, 'Sleep'