加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > Windows > 正文

windows – 查询线程(不处理)处理器关联?

发布时间:2020-12-14 02:09:18 所属栏目:Windows 来源:网络整理
导读:在 Windows上,您可以为进程调用SetProcessAffinityMask,为线程调用SetThreadAffinityMask.但是,Windows似乎只显示GetProcessAffinityMask而不是针对进程的各个线程的类似API. 我有一个多线程程序,可以在运行时将各个线程绑定到处理器.当我运行它时,我想(外部
在 Windows上,您可以为进程调用SetProcessAffinityMask,为线程调用SetThreadAffinityMask.但是,Windows似乎只显示GetProcessAffinityMask而不是针对进程的各个线程的类似API.

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

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

有谁知道如何查询这条信息?

解决方法

您可以通过两次调用 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以外的任何内容失败,则意味着我们要么对句柄没有足够的访问权限,要么系统遇到一些实际问题,因为它无法满足我们的请求.因此,在这种情况下继续没有意义.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读