0

每次按下按钮运行线程时,我都会尝试将线程的亲和性设置为某个掩码。打开窗户后我第一次这样做会起作用,但在那之后就不行了。但是,我的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);
    }
}    
4

1 回答 1

3

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

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

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

它确实假设它totalCores是 的倍数numberofCores,所以如果你有 16 个内核并且numberOfCores = 3,你会得到奇怪的结果。

于 2013-07-26T19:34:26.650 回答