SetThreadAffinityMask用法

roo*_*han 3 c++ winapi

我真的很难理解SetThreadAffinityMask函数.我试图用QueryPerformanceCounter函数实现一个计时器,但我不明白如何正确获得线程关联.msdn上的一个人发布了以下代码示例:

void HRTimer::StartTimer(void)
{
    DWORD_PTR oldmask = ::SetThreadAffinityMask(::GetCurrentThread(), 0);
    ::QueryPerformanceCounter(&start);
    ::SetThreadAffinityMask(::GetCurrentThread(), oldmask);
}
Run Code Online (Sandbox Code Playgroud)

但是当我采用这个代码片段时,SetThreadAffinityMask返回的oldmask的值为零.在MSDN上,我看到返回值为零意味着发生了错误.我调用了GetLastError()并获得了ERROR_INVALID_PARAMETER的错误代码.现在我想知道上面的代码片段是否正确.有人可以解释一下如何正确使用SetThreadAffinityMask,以便例如只在系统上的第一个CPU上调用QueryPerformanceCounter吗?或者上面的例子是否正确,尽管SetThreadAffinityMask返回零?

先感谢您.

Aub*_*bin 5

掩码是位域:每个位指定一个处理器.0表示"无处理器".这不是逻辑.

  • 0x0001:proc 1
  • 0x0003:proc 1和2
  • 0x000F:proc 1,2,3,4
  • ...

SetThreadAffinityMask的 MSDN