2008-10-02 4 views
6

Ich möchte sicherstellen, dass ein Thread auf einen bestimmten CPU-Kern verschoben wird und niemals vom Scheduler verschoben werden kann.Auf Win32, wie verschiebst du einen Thread auf einen anderen CPU-Kern?

Es gibt einen SetThreadAffinityMask() Anruf, aber es gibt keine GetThreadAffinityMask().

Der Grund, warum ich das brauche, ist, weil hoch aufgelöste Timer gestört werden, wenn der Scheduler diesen Thread zu einer anderen CPU verschiebt.

+0

Sie brauchen nicht * GetThreadAffinityMask(), nur SetThreadAffinityMask(). –

Antwort

9

Sie sollten wahrscheinlich nur SetThreadAffinityMask verwenden und darauf vertrauen, dass es funktioniert.

MSDN

+0

Beachten Sie, dass GetThreadAffinityMask nicht existiert ... – bltxd

3

Was sagte Ken. Aber wenn Sie nicht vertrauen, dass es funktioniert, können Sie SetThreadAffinityMask erneut aufrufen und bestätigen, dass der Rückgabewert dem entspricht, was Sie von der Maske erwarten. (Aber natürlich, wenn Sie der Funktion nicht vertrauen, dann können Sie dem zweiten Anruf nicht vertrauen ...)

Lassen Sie sich nicht durch die Existenz von GetProcessAffinityMask verwechseln. Diese Funktion ist nicht vorhanden, um zu überprüfen, ob SetProcessAffinityMask funktioniert hat, aber z. Sie können also eine Thread-Affinität erstellen, die eine Teilmenge der Prozessaffinität darstellt.

Schauen Sie einfach, dass der Rückgabewert und vergewissern Sie sich, dass es nicht 0 ist und Sie sollten in Ordnung sein.

1

Es ist nicht notwendig, Get Thread AffinityMask. Holen Sie sich einfach den Wert Get Prozess AffinityMask, schalten Sie einige Bits aus, dann rufen Sie SetThreadAffinityMask. Die Threads erben die Affinitätsmaske des Prozesses, und da ihre Affinität unter Ihrer Kontrolle steht, kennen Sie bereits die Affinitätsmaske eines Threads (es ist die, auf die Sie ihn setzen).

4

Wenn Sie eine Funktion aufrufen könnten, die eine Zahl zurückgibt, die angibt, auf welcher CPU der Thread ausgeführt wird, ohne Affinität zu verwenden, wäre die Antwort oft falsch, sobald die Funktion zurückgegeben wird. Das Überprüfen der von SetThreadAffinityMask() zurückgegebenen Maske ist so nah wie möglich, außerhalb des Kernel-Codes, der bei erhöhtem IRQL ausgeführt wird, und even that's changing.

Es klingt wie Sie versuchen, um RDTSC Uhr Skew Probleme zu arbeiten. Wenn Sie die RDTSC Anweisung direkt verwenden, betrachten QueryPerformanceCounter() Aufruf statt:

  • QueryPerformanceCounter() auf Windows Vista die HPET verwendet, wenn es durch den Chipsatz unterstützt wird und ist in dem ACPI-Tabellen des Systems.
  • AMD-basierte Systeme mit der AMD Processor Driver wird meist kompensieren Multi-Core Clock Skew, wenn Sie QueryPerformanceCounter() aufrufen, aber dies tut nichts für Anwendungen, die RDTSC direkt verwenden. Der AMD Dual-Core Optimizer ist ein Hack für Anwendungen, die RDTSC direkt verwenden, aber wenn der Betrag der Taktverschiebung sich aufgrund von C1-Takt-Rampen ändert (wo die Taktgeschwindigkeit im C1-Leistungszustand reduziert wird), haben Sie immer noch Taktsymmetrie. Und diese Dienstprogramme sind wahrscheinlich nicht sehr weit verbreitet, daher ist die Verwendung der Affinität mit QueryPerformanceCounter() immer noch eine gute Idee.