Подтвердить что ты не робот

Сколько потоков может создать приложение на С++

Я хотел бы знать, сколько потоков может создать приложение на С++. Включены ли на этих границах ОС, аппаратные ограничения и другие факторы?

4b9b3361

Ответ 1

С++, поскольку язык не указывает максимальный (или даже минимум за пределами). Конкретная реализация может, но я никогда не видел, чтобы это делалось напрямую. ОС также может, но, как правило, просто указывает, что система ограничена системными ресурсами. Каждый поток использует некоторую невыгружаемую память, таблицы селекторов, другие связанные вещи, поэтому у вас может закончиться это. Если вы этого не сделаете, система станет невосприимчивой, если потоки действительно будут работать.

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

Ответ 2

[C++11: 1.10/1]: [..] В рамках размещенной реализации программа С++ может работать одновременно с несколькими потоками. [..] В рамках автономной реализации определяется реализация, может ли программа иметь более одного потока выполнения.

[C++11: 30.3/1]: 30.3 описывает компоненты, которые можно использовать для создания и управления потоками. [Примечание: Эти потоки предназначены для сопоставления "один к одному" с потоками операционной системы. -end note]

Итак, в основном, это полностью зависит от реализации и ОС; С++ не волнует!

Он даже не перечисляет рекомендацию в Приложении B "Объемы реализации"! (что на самом деле кажется упущением).

Ответ 3

В принципе, на уровне С++ есть без ограничений. Число максимальных потоков больше на уровне ОС (на основе вашей архитектуры и доступной памяти).

В Linux нет ограничений на максимальное количество потоков на процесс. Количество потоков ограничено по всей системе. Вы можете проверить количество максимально разрешенных потоков, выполнив:

cat /proc/sys/kernel/threads-max

В Windows вы можете использовать инструмент testlimit, чтобы проверить максимальное количество потоков: http://blogs.technet.com/b/markrussinovich/archive/2009/07/08/3261309.aspx

В Mac OS, пожалуйста, прочитайте эту таблицу, чтобы найти количество потоков на основе конфигурации вашего оборудования

Однако имейте в виду, что вы находитесь в системе многозадачности. Количество потоков, выполняемых одновременно, ограничено общим количеством доступных процессорных ядер. Чтобы сделать больше вещей, система пытается переключиться между всеми тезами. Каждый "переключатель" имеет производительность (несколько миллисекунд). Если ваша система слишком много "переключается", она не будет слишком много работать, чтобы "работать", и ваша общая система будет медленной.

Ответ 4

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

Если вы не сойдете с ума от создания потоков, очень маловероятно, что проблема будет иметь предел. Создание большего количества потоков редко бывает полезным, как только вы достигнете определенного числа - это число может быть примерно таким же или в несколько раз больше, чем количество ядер (что для реального большого, тяжелого оборудования может составлять несколько сотен в эти дни, с 16-ядерными процессорами и 8 разъемами).

Потоки, которые связаны с ЦП, не должны быть больше числа процессоров - от этого ничего хорошего не получается.

Потоки, выполняющие ввод-вывод или иначе "сидящие вокруг ожидания", могут быть выше в номерах - по 2-5 на процессорное ядро ​​представляется разумным. Учитывая, что современные машины имеют 8 гнезд и 16 ядер в верхнем конце спектра, которые по-прежнему только около 1000 потоков.

Конечно, можно спроектировать, скажем, систему веб-сервера, где каждое соединение является потоком, а система имеет 10k или 20k соединений, активных в любой момент времени. Но он, вероятно, не самый эффективный.

Ответ 5

Помимо общей нецелесообразности наличия большего количества потоков, чем ядер, да, существуют ограничения. Например, система может сохранять уникальный "идентификатор процесса" для каждого потока, и может быть доступно только 65535 из них. Кроме того, каждый поток будет иметь свой собственный стек, и эти стеки в конечном итоге будут потреблять слишком много памяти (однако вы можете отрегулировать размер каждого стека при появлении потоков).

Здесь информативная статья - игнорирует тот факт, что он упоминает Windows, поскольку понятия аналогичны для других общих систем: http://blogs.msdn.com/b/oldnewthing/archive/2005/07/29/444912.aspx

Ответ 6

В стандарте С++ ничего не существует, что ограничивает количество потоков. Однако ОС, безусловно, будет иметь жесткий предел.

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

Ответ 7

Я хотел бы знать, сколько потоков может создать приложение на С++.

Реализация/OS-зависимыми.

Имейте в виду, что на С++ до С++ 11 не было нити.

Оказывает ли ОС, аппаратные ограничения и другие факторы на этих границах?

Да.

ОС может ограничить количество потоков, которые может создать процесс.
OS может ограничить общее количество потоков, выполняемых одновременно (чтобы предотвратить использование вилочных бомб и т.д., Linux может определенно сделать это).
Доступная физическая (и виртуальная) память ограничит количество потоков, которые вы можете создать, если каждый поток распределяет свой собственный стек.
Может быть (возможно, жестко запрограммированное) ограничение на количество потоков, которые могут обрабатывать операторы. Базовая ОС/платформа может вообще не иметь потоков (компилятор реального режима для DOS/FreeDOS или что-то подобное).