Отключение многоядерных программ программно - PullRequest
0 голосов
/ 04 марта 2010

Есть ли какой-нибудь возможный способ отключить многоядерную функциональность в Windows и просто использовать одно ядро ​​с помощью C \ C ++? Любая библиотека, которая позволяет это? Мое приложение обращается к одному из наших чиповых модулей, используемых для связи с хостом. Мы подозреваем, что кто-то еще обращается к этому модулю и изменяет его. Странно то, что это происходит только в многоядерной системе (Windows 7 64bit), и когда вы устанавливаете в Windows только одно ядро ​​( Как отключить ядро ​​), все прекрасно работает.

Мне кажется, что Windows не должна позволять какой-либо программе выполнять ее программно, но я надеюсь, что ошибаюсь.

РЕДАКТИРОВАТЬ: Я не ищу предложений по улучшению моих навыков потоков. Возможно, моя проблема связана с аппаратным обеспечением или прошивкой (возможно, второе ядро ​​также обращается к моему чип-модулю).

2-е РЕДАКТИРОВАНИЕ: НЕ программная проблема! Я только хочу знать, возможно ли отключить многоядерный с помощью C \ C ++. Я не обращаюсь к советам по многопоточности, так как на 100% уверен, что проблема не в этом.

3-е РЕДАКТИРОВАНИЕ: проблема была решена. Проблема была в другом процессе, который выполнял мой клиент, который обращался к той же общей памяти, к которой обращалось мое приложение. Как я уже упоминал ранее, с моей веткой проблем не было, и я так и не получил ответ, который искал: простое «да» или «нет» в отношении погоды можно отключить одно из ядер с помощью C ++. Сродство к процессору не помогло в моем особом случае.

Ответы [ 5 ]

2 голосов
/ 04 марта 2010

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

1 голос
/ 04 марта 2010

Даже на одном ядре вас могут прервать в любой момент. Поэтому я подозреваю, что ваша проблема связана с переключением ядер.

1 голос
/ 04 марта 2010

Если вы подозреваете, что аппаратный драйвер не является потокобезопасным, используйте следующее для установки соответствия прерывания.

http://www.microsoft.com/whdc/system/sysperf/intpolicy.mspx

0 голосов
/ 04 марта 2010

Многопоточность - зверь. Даже "надежный" иногда кусает тебя в ... хм ... "назад".

Когда вы используете потоки, вы должны делать это правильно, потому что ОС имеет только несколько правил, которым она должна следовать, и может планировать ваши потоки, как пожелает. IIRC вы можете устанавливать приоритеты и т. Д., Возможно, выражать что-то вроде предпочтений для определенных процессоров в некоторых ОС.

Даже если вы используете только один дополнительный поток, у вас все еще есть два, потому что основное приложение также работает.

Возможно, взгляните на средства отладки, которые специализируются на отладке потоков. Может быть, они могут помочь вам с этим.

Для начала я бы добавил несколько мьютексов или синхронизированных областей, которые обращаются к модулю.

0 голосов
/ 04 марта 2010

Если ваша библиотека C / C ++ не использует многопоточность, я не могу представить, как количество ядер может повлиять на поведение во время выполнения. Если ваше приложение использует потоки, они, вероятно, будут работать немного по-разному на одном ядре по сравнению с несколькими ядрами, но если вы можете получить ошибку в многоядерной системе, вы, вероятно, получите такую ​​же ошибку в одноядерной системе.

Вы можете установить привязку процессора при запуске приложения. Это блокирует ваше приложение на один процессор. Это может быть простым решением проблемы.

...