【问题标题】:SetThreadAffinityMask UsageSetThreadAffinityMask 用法
【发布时间】:2012-10-17 20:48:13
【问题描述】:

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

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

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

提前谢谢你。

【问题讨论】:

    标签: c++ winapi


    【解决方案1】:

    掩码是一个位域:每个位指定一个处理器。 0 表示“无处理器”。这不符合逻辑。

    • 0x0001:过程 1
    • 0x0003 : 过程 1 和 2
    • 0x000F : 过程 1、2、3、4
    • ...

    SetThreadAffinityMask 的 MSDN

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-20
      • 1970-01-01
      • 1970-01-01
      • 2020-01-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多