0

並行性についての理解を深めるために、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'
4

0 に答える 0