C# multi CPU для ThreadPool.QueueUserWorkItem
У меня есть программа, которая использует:
ThreadPool.QueueUserWorkItem(new WaitCallback(FireAttackProc), fireResult);
На Windows7 и Vista работает нормально.
Когда я пытаюсь запустить его на XP, результат немного отличается от других.
Мне просто интересно, для правильного выполнения QueueUserWorkItem мне нужна система с двумя процессорами?
На XP, на которой я пытался протестировать, был установлен.Net 3.5.
Входные данные приветствуются.
РЕДАКТИРОВАТЬ: обратный вызов воспроизводит серию звуковых файлов. в win7 и vista они все играют. но в XP только пара из них играет. Я не получаю никаких исключений из программы.
РЕДАКТИРОВАТЬ: Да, коробка XP является одноядерным. более 5 лет.
РЕДАКТИРОВАТЬ: мое приложение использует Winsock, и я запустил и клиент и сервер на машине XP. Я попробую запустить его с одним экземпляром на машину и посмотреть, как он отреагирует.
РЕДАКТИРОВАТЬ: Как вы играете звуки?
SoundPlayer fire = new SoundPlayer(Properties.Resources.fire);
fire.PlaySync();
fire.Dispose();
5 ответов
Основное отличие состоит в том, что в одноядерной системе одновременно может работать только один поток. Если ваша программа спроектирована правильно, это не должно иметь значения, так как операционная система включает и выключает потоки и управляет этим для вас.
Если вы видите разницу в одноядерной системе, это, скорее всего, означает, что в вашем коде есть условие гонки. Единственная разница должна заключаться в том, что это занимает больше времени - поскольку ОС не может запускать оба потока одновременно.
Vista и Windows 7 обрабатывают аудио не так, как Windows XP, так что это, вероятно, реальный источник вашей проблемы (то есть он не имеет ничего общего с QueueUserWorkItem
).
Как вы играете звуки (поскольку есть много разных способов сделать это)?
Изменить: Когда вы говорите, что играете "серию" звуков, вы имеете в виду, что вы пытаетесь воспроизводить один звук за другим, или вы пытаетесь воспроизводить несколько звуков одновременно?
Поведение менеджера ThreadPool имеет значение. Он старается избегать планирования большего количества потоков, чем у вас есть ядра. Таким образом, если ваш компьютер с XP имеет одноядерный процессор, он будет запускать только один поток. Только когда потоки "застревают" и не завершаются своевременно, это позволяет другому потоку запускаться. Эти решения по планированию принимаются дважды в секунду.
Учитывая, что вы используете потоки для воспроизведения звуков, поток пула потоков не является подходящим решением. Вы должны создать свою собственную тему.
Что именно вы видели?
Синхронизация с потоками не является детерминированной, поэтому неудивительно, что вы видели другие результаты, если запускали его на однопроцессорной машине. Это связано с тем, что только с одним ядром (без гиперпоточности) одна инструкция может выполняться только за один раз, поэтому вы не увидите истинного параллельного выполнения.
НО, Windows XP поддерживает несколько ядер, как Windows 7 или Vista. Я предполагаю, что машина с XP, на которой вы ее запускали, была старше и имела только 1 процессор?
Вы можете столкнуться с проблемами при воспроизведении звукового файла API. Ссылка ниже говорит о проблемах воспроизведения нескольких звуковых файлов через очень короткие промежутки времени или почти одновременно с использованием PInvoke из приложения C#. Может ли это быть похоже на вашу проблему?
http://www.hanselman.com/blog/CategoryView.aspx?category=BabySmash&page=3