#c #windows
#c #Windows
Вопрос:
У меня многопоточная программа, и меня попросили добавить опцию для размещения каждого потока на своем собственном ядре (CPU, processor, что угодно).
Я написал код для этого, используя SetThreadAffinityMask(). Я получаю маску соответствия процесса по умолчанию, проверяю, достаточно ли процессоров для этого, затем устанавливаю маску соответствия каждого потока так, чтобы она включала только один из доступных процессоров (и отличалась для каждого потока).
Кажется, что все это компилируется и запускается без проблем, но как мне проверить, действительно ли это работает?
Кажется, должен быть какой-то инструмент мониторинга, который показывает, на каком процессоре запущен поток, но я не могу его найти. ProcessExplorer
покажет загрузку процессора потока, но не на каком процессоре это произошло. Я просмотрел возможные счетчики, которые можно использовать на perfmon
, но опять же я смог найти только% использования, а не какой процессор.
Было предложено, чтобы я выполнил GetThreadAffinityMask () и сообщил об этом, но мне кажется, это просто сообщит, что я правильно вызвал SetThreadAffinityMask () .
Итак, я должен просто принять это на веру, что SetThreadAffinity () будет делать именно то, что я хочу?
(ПРИМЕЧАНИЕ: я нашел довольно много, казалось бы, похожих вопросов на SO, но ни один из них на самом деле не содержит ответа на этот конкретный вопрос).
Ответ №1:
Используйте GetCurrentProcessorNumber()
( http://msdn.microsoft.com/en-us/library/windows/desktop/ms683181 (v =против85).aspx )
Комментарии:
1. Возможно, вам нужно будет выполнить выборку с помощью этой функции, чтобы убедиться, что номер процессора сохраняется в течение всего выполнения.
2. Хммм. Для этого потребовалось бы модифицировать каждый поток, чтобы отслеживать это самостоятельно. Я полагаю, я мог бы написать какой-нибудь временный отладочный код для этого. Не оптимально, но нищим выбирать не приходится.
3. … обратите внимание, что я компилирую с библиотеками уровня XP, но эта ссылка решила эту небольшую проблему. scss.tcd.ie/Jeremy . Jones/GetCurrentProcessorNumberXP.htm
4. В итоге у меня это сработало, поэтому я принимаю это. Обратите внимание, что процедура, которую я предоставил в комментарии выше, похоже, не предоставляет идентификаторы процессора на основе какой-либо различимой схемы. Чтобы сопоставить их с номерами привязки к процессору, мне пришлось вручную перебирать все биты привязки в потоке и вызывать процедуру.
Ответ №2:
Вы можете вызвать GetCurrentProcessorNumber, чтобы получить номер процессора текущего выполняющегося потока.