2010-03-04 2 views
0

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

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

EDIT: Я не ищу предложения, исправляющего мои навыки резьбы. Моя проблема, возможно, связана с большим количеством аппаратного или программного обеспечения (возможно, второе ядро ​​также имеет доступ к моему модулю чипа).

2nd EDIT: Это NOT проблема с программным обеспечением! Я только хочу знать, можно ли отключить многоядерное ядро ​​с помощью C \ C++. Я не ищу советы по нарезке, поскольку я на 100% уверен, что проблема не лежит там.

3-й ИЗОБРАЖЕНИЕ: вопрос был РЕШЕН. Проблема заключалась в том, что мой клиент работал с другим процессом, к которому обращался доступ к той же общей памяти, к которой обращалось мое приложение. Как я уже упоминал ранее, никаких проблем с моей нитью не было, и я не получил ответа, который я искал: простой Да или Нет относительно погоды, можно отключить один из ядер с помощью C++. Приоритет процессора не был полезным в моем специальном случае.

+6

Похоже, что у вас может быть связанная с потоком ошибка в вашем приложении, которая просто не проявляется при работе на одном ядре (достаточно часто). Не слишком редко. – rjnilsson

+0

@CWAN: Это не может быть связанной с потоком ошибка, поскольку только один поток получает доступ к моему модулю чипа. – Eldad

ответ

0

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

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

+0

Моя библиотека использует потоки, но только один поток обращается к этому модулю. Нет другого способа доступа к этому модулю. – Eldad

+1

@ Eldad: Это все еще простая вещь, чтобы попробовать, чтобы убедиться. Всегда есть вероятность, что этот единственный поток использует данные с другими потоками, а затем заканчивает использование поврежденных данных при доступе к модулю. В зависимости от шаблона доступа приложения к модулю вы даже можете попытаться настроить близость процессора, когда приложение уже запущено (с помощью диспетчера задач). – rjnilsson

+0

Пробовал, но это не сработало. – Eldad

1

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

0

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

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

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

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

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

2

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

Смежные вопросы