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

Другие вопросы по тегам