Синхронизация потоков - максимальное количество потоков для процесса - PullRequest
0 голосов
/ 12 сентября 2011

Я пробовал простую программу с точки зрения синхронизации потоков с использованием pthreads в системе Linux.Исходный код моей программы можно найти по адресу http://pastebin.com/5EWS68NL.

. По сути, программа должна печатать число 1 в LIMIT (произвольное число) в порядке возрастания.Каждому номеру назначается нить, он ждет, пока не будет передана сигнальная переменная условия, и печатает номер.

Программа работает до LIMIT = 380.Более того, программа зависает.То есть я не думаю, что pthread_create () возвращает ошибку, так как я пытался напечатать номер ошибки, а также включил fflush (stdout) в случае ошибки.

Максимальное количество потоков дляСистему можно указать в / proc / sys / kernel / threads-max.Я пытался увеличить его до сколь угодно большого числа, но безуспешно.Программа просто зависает, если число потоков составляет около 380.

Есть мысли, почему это может иметь место?Будет ли это значение '380' отличаться в разных системах?

Спасибо и С уважением,
Хришикеш Мурали

1 Ответ

0 голосов
/ 13 сентября 2011

Я изменил LIMIT на 50000, и он выдает ошибку из-за нехватки памяти, чего я и ожидал, после примерно 32 000 потоков.В противном случае он работает нормально.

Я сделал это небольшое изменение, чтобы остановить выполнение при ошибке pthread_create.

    if ( ret_val )
    {
        printf("Couldn't create thread number %d - %s\n", iter, strerror(ret_val) );
        fflush(stdout);
        exit(1);
    }

Поскольку вы не останавливаетесь на ошибке, возможно, вы просто провалились и начали печатать числаи не видел ваше сообщение об ошибке?

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

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

...