Максимальное количество потоков - PullRequest
4 голосов
/ 02 октября 2010

У меня есть программа, которая принимает 2 N -значные числа, умножает их, используя потоки, и печатает вывод.

Количество создаваемых потоков равно 2 * N - 1.

всякий разЯ запускаю программу для N > 151, программа выдает ошибку сегментации.

Есть ли ограничение на максимальное количество потоков, которое процесс может получить из пула потоков?

Если это так, может ли это быть действительной причиной ошибки?

Редактировать:

Valgrind не находит утечек памяти для N <= 150.

Я запускаю программу в ядре Linux 2.6.x.

Ответы [ 6 ]

10 голосов
/ 02 октября 2010

По умолчанию каждый поток получает стек по 8 МБ.300 потоков по 8 МБ - это 2,4 ГБ только для стеков потоков - если вы работаете в 32-разрядном режиме, то это, вероятно, большая часть разрешенного адресного пространства процесса.

Вы можете использовать pthread_attr_setstacksize(), чтобы уменьшить размерперед тем, как вы их создадите, ваш стек станет более разумным:

int pthread_attr_setstacksize (pthread_attr_t *__attr, size_t __stacksize)

(создайте новый pthread_attr, установите размер стека и передайте значение pthread_create).

2 голосов
/ 15 августа 2011

POSIX гарантирует вам 64 потока. Более того, это подарок от реализации.

1 голос
/ 02 октября 2010

Мой ящик с Ubuntu показывает ограничение в 123858, поэтому я сомневаюсь, что вы наберете 300, но ваш pthread_create вернул бы ненулевое значение, если бы вы былиОбязательно проверьте возвращаемое значение.

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

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

1 голос
/ 02 октября 2010

Ваш вопрос не определяет операционную среду, которая необходима для того, чтобы иметь возможность ответить на ваш первый вопрос, но если вы привязаны к процессору и количество потоков превышает количество ядер процессора (2 или 4 на большинстве ноутбуков), то вы, вероятно, тратите ресурсы.

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

1 голос
/ 02 октября 2010

Если под Linux: отметьте PTHREAD_THREADS_MAX в limits.h. Это макс. допустимое количество потоков на процесс. А также: это не должно быть причиной ошибки сегмента.

1 голос
/ 02 октября 2010

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

Я подозреваю, что их будет максимальное количество потоков, учитывая, что это задача ЦПуправлять ими.Я бы не использовал более 100 потоков, это очень плохая идея.

...