3

SetThreadAffinityMask関数を理解するのに本当に苦労しています。QueryPerformanceCounter関数を使用してタイマーを実装しようとしていますが、スレッドアフィニティを正しく取得する方法がわかりません。msdnの男が次のコード例を投稿しました。

void HRTimer::StartTimer(void)
{
    DWORD_PTR oldmask = ::SetThreadAffinityMask(::GetCurrentThread(), 0);
    ::QueryPerformanceCounter(&start);
    ::SetThreadAffinityMask(::GetCurrentThread(), oldmask);
}

しかし、このコードスニペットを採用すると、SetThreadAffinityMaskによって返されるoldmaskの値はゼロになります。MSDNで、戻り値がゼロの場合はエラーが発生したことを意味していることがわかりました。GetLastError()を呼び出して、ERROR_INVALID_PARAMETERのエラーコードを取得しました。上記のコードスニペットが正しくないかどうか疑問に思っています。たとえば、QueryPerformanceCounterがシステムの最初のCPUでのみ呼び出されるように、SetThreadAffinityMaskを正しく使用する方法を誰かに説明してもらえますか?または、SetThreadAffinityMaskがゼロを返すにもかかわらず、上記の例は正しいですか?

前もって感謝します。

4

1 に答える 1

5

マスクはビットフィールドです。各ビットはプロセッサを指定します。0は「プロセッサなし」を意味します。それは論理ではありません。

  • 0x0001:proc 1
  • 0x0003:proc1および2
  • 0x000F:proc 1、2、3、4
  • ..。

SetThreadAffinityMaskのMSDN

于 2012-10-17T20:52:47.297 に答える