並行性についての理解を深めるために、FASM を試しています。それぞれがいくつかの を作成する 2 つのスレッドを持つプログラムを作成しましたlock xadd
。i7 の Win7 64 ビットで実行したところ、非常に興味深い結果が得られました。プログラム自体は正しく動作しますが、予想した 2 つではなく 4 つのコアをロードします。
タスク マネージャーの「パフォーマンス」は 4 コアの明確な負荷を示します
リソース モニターの [CPU] タブに、プロセスに 2 つのスレッドがあることが表示される
なぜそれが起こるのかについて誰かがヒントを与えることができますか? 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'