Wie kann ich mit SetProcessAffinityMask mehr als einen logischen Prozessor auswählen?
Im Windows Task-Manager können Sie dies als Beispiel tun:
Ich habe meine Prozedur CreateProcess aktualisiert, um dies zu tun:
%Vor%Beachten Sie die Kommentare, die ich dort abgegeben habe. Es wäre gut, meine Prozedur zu aktualisieren, um einen neuen Affinity-Parameter aufzunehmen, den ich an SetProcessAffinityMask übergeben kann.
Bei einem Aufruf werden die entsprechenden Prozessoren aus offensichtlichen Gründen nicht ausgewählt, sie geben die Vorstellung von dem, was ich tun möchte:
%Vor%Wählen Sie beispielsweise eine beliebige CPU für einen Prozess, wie im Task-Manager angezeigt.
Wie soll ich das machen, mit einem Array, Set oder etwas anderem? Ich kann es nicht mit mehreren Werten arbeiten.
Danke.
Es ist eine Bitmaske, wie in der Dokumentation beschrieben.
>Eine Prozessaffinitätsmaske ist ein Bitvektor, in dem jedes Bit einen logischen Prozessor darstellt, auf dem die Threads des Prozesses ausgeführt werden dürfen.
Und so weiter. Sie können das logische or
verwenden, um sie zu kombinieren. Die Prozessoren 0 und 1 wären also oder
, was gleich
ist.
Ich würde den Verschiebungsoperator shl
verwenden, um Werte für bestimmte Prozessoren zu erstellen. So:
Sie können dies leicht erweitern, um Masken für Listen von Prozessoren zu erzeugen, die das logische or
in einer Schleife verwenden.
Sie können testen, ob sich ein Prozessor in einer Bitmaske befindet:
%Vor% Hinweis : Ich verwende DWORD_PTR
, weil die Bitmaske für 64-Bit-Ziele 64 Bit breit ist. Diese Nuance ist für dich auf XE nicht wichtig, aber es lohnt sich, es richtig zu machen, um zukünftige Code-Portierungen zu vereinfachen.
Es ist eine 32-Bit Bitmaske auf meinem XE (aber es könnte 64-Bit auf 64-Bit XE2 sein!)
Definieren Sie einfach eine Menge von [0..31] wobei 0 = cpu 1 etc.
Geben Sie dann mask das Ergebnis in ein DWord ein.
Also
%Vor%