Вы можете сделать это двумя вызовами на SetThreadAffinityMask
.Эта функция возвращает исходную маску сходства для переданного дескриптора потока.
Итак ... выполните один вызов с маской, которая устанавливает сходство с одним ЦП, а затем выполните второй вызов для восстановленияисходная маска.
Вот полный исходный код 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;
}
Этот код проверяет один ЦП за раз, пока не сработает настройка (в данном случае мы сейчасзнать оригинальную маску!) или пока начальная 1
не будет сдвинута из DWORD
.Если запрашивается процессор, который недоступен, функция завершается с ошибкой ERROR_INVALID_PARAMETER
, и мы просто попробуем следующий.Обычно первый процессор просто работает, поэтому он достаточно эффективен.
Если функция завершается ошибкой с чем-либо, кроме ERROR_INVALID_PARAMETER
, это означает, что у нас либо недостаточно прав доступа к дескриптору, либо к системе.возникают некоторые реальные проблемы, потому что он не может выполнить наш запрос.Поэтому продолжать в этом случае не имеет смысла.