每次我通过按下按钮运行一个线程时,我都试图将我的线程的亲和性设置为某个掩码。打开窗口后我第一次这样做时它会起作用,但之后就不行了。但是,我的 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。
它确实假定 totalCores
是 numberofCores
的倍数,因此如果您有 16 个内核且 numberOfCores = 3
,您将得到奇怪的结果。
关于c++ - SetThreadAffinityMask() 似乎不止一次生效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17885787/