c++ - SetThreadAffinityMask() 似乎不止一次生效

标签 c++ windows winapi visual-c++

每次我通过按下按钮运行一个线程时,我都试图将我的线程的亲和性设置为某个掩码。打开窗口后我第一次这样做时它会起作用,但之后就不行了。但是,我的 OutputDebugString 代码生成的输出表明它已被更改。我试过使用 CloseHandle() 但这似乎没有效果。还有其他可能吗?

void CSMPDemoDlg::OnBnClickedButton1()
{
    // Start thread
    DWORD_PTR affinityMask = (static_cast<DWORD_PTR>(1) << NumberOfCores ) - 1;

    HANDLE WorkThreadHandle = CreateThread(NULL, 0, WorkThread, &tp, 0, NULL);
    DWORD_PTR z = SetThreadAffinityMask(WorkThreadHandle, affinityMask);

    if (z!=0) {
        char bb[100];
        sprintf_s(bb, 100, "Affinity changed from %d to %d", z, affinityMask);
        OutputDebugString(bb);
    }
}    

最佳答案

所以,你想要这样的东西:

 static count = 0;
 DWORD_PTR affinityMask = (static_cast<DWORD_PTR>(1) << NumberOfCores ) - 1;
 affinityMask <<= ((count * numberOfCores)  % totalCores);

这意味着它将在组中的下一组内核上运行,因此如果您在第一个内核上运行,比如说 4 个内核,它将在内核 0..3 上运行,然后是 4..7,然后8..11。

它确实假定 totalCoresnumberofCores 的倍数,因此如果您有 16 个内核且 numberOfCores = 3,您将得到奇怪的结果。

关于c++ - SetThreadAffinityMask() 似乎不止一次生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17885787/

相关文章:

Windows 与 Linux 上的 Python 目录结构

wcf - 停止服务时客户端 CPU 几乎达到 100%

c++ - 如何使用 Win32 操作现有桌面快捷方式的图标?

c - Malloc 是否分配了比需要的更多的内存?

c++ - 如何处理 RapidXml 错误?

c++ - 传递要动态查找的成员

c++ - 多维数组类错误

node.js - pm2 - 如果没有启动如何启动,如果启动如何杀死并启动

c++ - 系统上下文菜单图标不像 WinRAR 那样透明

bool 值或函数调用表达式中的 C++ 惰性求值