gpt4 book ai didi

windows - 查询线程(不是进程)处理器亲和性?

转载 作者:可可西里 更新时间:2023-11-01 13:51:12 28 4
gpt4 key购买 nike

在 Windows 上,您可以为进程调用 SetProcessAffinityMask,为线程调用 SetThreadAffinityMask。但是,Windows 似乎只公开 GetProcessAffinityMask 而不是针对进程的各个线程的类似 API。

我有一个多线程程序,它在运行时将各个线程绑定(bind)到处理器。当我运行它时,我想(从外部)查询哪些线程正在哪些处理器上运行,以确保它正常工作。我编写了一个小型命令行实用程序来执行此操作。但我似乎无法找到一种方法来查找单个线程绑定(bind)到哪些处理器或核心。

这显然是可能的;我在网上看到 adplus 调试实用程序能够显示类似 pstack 的输出以显示线程关联的描述。 Process Explorer 在多处理器机器上显示一个线程选项卡,显示线程的“理想处理器”。

有谁知道怎么查询这条信息吗?

最佳答案

您可以通过两次调用 SetThreadAffinityMask 来完成此操作.此函数返回传递的线程句柄的原始关联掩码

所以...使用掩码进行一次调用,该掩码将亲和性设置为一个 CPU,然后进行第二次调用以恢复原始掩码。

这是完整的 C/C++ 源代码,包括错误检查:

DWORD GetThreadAffinityMask(HANDLE thread)
{
DWORD mask = 1;
DWORD old = 0;

// try every CPU one by one until one works or none are left
while(mask)
{
old = SetThreadAffinityMask(thread, mask);
if(old)
{ // this one worked
SetThreadAffinityMask(thread, old); // restore original
return old;
}
else
{
if(GetLastError() != ERROR_INVALID_PARAMETER)
return 0; // fatal error, might as well throw an exception
}
mask <<= 1;
}

return 0;
}

此代码一次探测一个 CPU,直到设置关联起作用(在本例中我们现在知道原始掩码!)或直到初始 1 已移出 DWORD 。如果请求的 CPU 不可用,该函数将失败并显示 ERROR_INVALID_PARAMETER,我们只需尝试下一个。通常第一个 CPU 会工作,因此效率相当高。

如果函数因 ERROR_INVALID_PARAMETER 以外的任何原因失败,则意味着我们没有足够的句柄访问权限,或者系统存在一些实际问题,因为它无法实现我们的要求。因此,在这种情况下继续下去是没有意义的。

关于windows - 查询线程(不是进程)处理器亲和性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6601862/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com