Я просто изучаю, как писать mutithreaded программы прямо сейчас, и у меня есть гипотетический вопрос о том, сколько потоков является оптимальным для программы.Сколько потоков необходимо создать?
Позвольте мне описать 2 сценария.
Первый сценарий заключается в том, что у меня есть программа, которая легко многопоточна, но каждый поток будет выполнять большую работу (время выполнения для каждого потока составляет порядка секунд).
Второй сценарий заключается в том, что у меня есть программа, которая также легко представляет собой многопоточный поток, но каждый поток имеет очень короткое время выполнения, порядка миллисекунд.
В любом из этих сценариев, что является наиболее эффективным способом mutithreading программ? Является ли это либо созданием столько потоков, сколько позволит моя системная память, либо дождаться завершения потоков до создания новых, так что у меня будет только один из четырех рабочих потоков, выполняемых в любой момент времени.
С одной стороны, многие потоки могут иметь проблемы с верхним напряжением, когда ядра переключаются между потоками (из моего понимания, его не так тяжело накладные расходы). С другой стороны, если я ограничу количество запущенных потоков, это означает, что я буду запускать дополнительные условия проверки и блокировать и разблокировать переменную счетчика, чтобы отслеживать количество запущенных потоков и создавать новые потоки, когда старые заканчиваются ,
Я вижу, что если есть много небольших потоков, было бы лучше просто перегрузить мою систему с таким количеством потоков, сколько возможно, так как там не будет слишком много переключения потоков, прежде чем поток закончит работу. Это избавило бы меня от накладных расходов, постоянно отслеживая количество потоков.
Кроме того, если есть только несколько больших потоков (немногими, я имею в виду пару сотен крупных), имеет смысл отслеживать потоки, чтобы мы сохраняли потоки в оптимальных числах, чтобы там очень много переключений потоков (поскольку, поскольку накладные расходы были бы больше, поскольку мы, скорее всего, переключались бы много раз, пока не закончится один поток).
Так будут ли эти предположения правильными для каждого случая или существует универсальный способ делать то, что было бы правильным во всех ситуациях?
Примечание: это предполагает систему с несколькими ядрами (на данный момент, позволяет игнорировать гиперпоточность) и позволяет игнорировать любые типичные проблемы, связанные с mutithreading (предположим, что все потоки имеют частные записи и могут читать только из публичных, блокировать и разблокировка происходит только при увеличении или уменьшении счетчика числа активных потоков).
Спасибо,
-Faken
Хорошая точка. Если задача будет выполняться в течение микросекунды, потребуется немного времени, чтобы настроить поток и запустить его, выполняя настоящую работу! –
Также, если вы используете C++ и Visual Studio 2010, доступны библиотека параллельных шаблонов и время выполнения параллелизма (PFX - .NET). См. Центр параллелизма для указателей на код .NET и C++: http://msdn.microsoft.com/en-us/concurrency/default.aspx – Rick