Как я могу получить количество доступных процессоров для моего приложения?

Я знаю, как получить количество физических и логических процессоров на моей машине, но я хочу знать, к скольким логическим процессорам имеет доступ мое приложение.

Например, я разрабатываю на четырехъядерной машине, но у меня есть несколько одноядерных пользователей, и во многих случаях я «тупею» в интерфейсе или сталкиваюсь с проблемами блокировки, которые никогда не возникают в многоядерной системе.

Итак, с этой целью я настроил VSTS для создания моего приложения либо в режиме отладки, либо в режиме «Отладка одного ядра». Цель в основном состоит в том, чтобы установить привязку процессора к ядру «0», что, глядя на диспетчер задач Windows, работает, как и ожидалось.

Моя проблема в том, что я только что заметил (и задним числом это должно было быть очевидно), что во всем моем коде у меня есть Environment.ProcessorCount >= something, который отлично работает для действительно одноядерных машин, но не дает мне прочитать мой единственный «логически доступное ядро».

Как я могу получить количество «доступных» логических ядер?

С# предпочтительнее


person Russ    schedule 25.01.2010    source источник
comment
Это то, что я использую, мне не нужно общее количество физических или общее количество логических, я хочу количество доступных мне логических процессоров   -  person Russ    schedule 25.01.2010
comment
Хм, в таком случае я, возможно, поторопился: чем «доступные логические процессоры» отличаются от «всего логических процессоров»?   -  person Jeff Sternal    schedule 25.01.2010
comment
Я могу установить привязку процессора к четырехъядерной системе для приложения, чтобы оно могло использовать только 1, 2, 3 или 4 доступных ядра. По умолчанию приложение имеет доступ ко всем 4, но в моем случае бывают случаи, когда я хочу ограничить приложение только одним ядром, но у меня все равно физически и логически 4 процессора на машине. Environment.ProcessorCount считывает переменные среды, поэтому на него не влияют никакие изменения привязки к приложениям.   -  person Russ    schedule 25.01.2010
comment
Что ж, я проработал больше ответов в посте, на который вы ссылались, сразу же. Хотя принятый ответ - это не то, что я ищу, если вы прокрутите вниз до ответа Джесси Слайсера, это то, что я ищу.   -  person Russ    schedule 25.01.2010
comment
Ах, потрясающе! Спасибо за обновление - пойду сам чему-нибудь научусь. :)   -  person Jeff Sternal    schedule 25.01.2010


Ответы (1)


Особая благодарность за ответ Джесси Слайсера, найденный здесь.

Хотя это и не принятый ответ на заданный вопрос, это именно тот ответ, который я ищу.

Вот в основном то, что я получил, основываясь на ответе Джесси.

#if !DEBUG
                return Environment.ProcessorCount;
#endif
                using (Process currentProcess = Process.GetCurrentProcess())
                {
                    var processAffinityMask =
                        (uint) currentProcess.ProcessorAffinity;
                    const uint BitsPerByte = 8;
                    var loop = BitsPerByte*sizeof (uint);
                    uint result = 0;

                    while (loop > 0)
                    {
                        --loop;
                        result += (processAffinityMask & 1);
                        processAffinityMask >>= 1;
                    }

                    return Convert.ToInt32((result != 0) ? result : 1);
                }
person Russ    schedule 25.01.2010
comment
Обратите внимание, что в настоящее время это не работает в Mono, так как ProcessorAffinity еще предстоит сделать. У меня была та же основная идея в каком-то коде, и я был чертовски сбит с толку, почему это работает в .NET, а не в Mono, пока я не понял, что я не делал этого неправильно, просто это не поддерживалось. - person Jon Hanna; 18.01.2014