Как избавиться от исключения boost thread: failed in pthread_create: Resource temporarily unavailable?

Я изучаю мультипоточное программирование и программирование сетевых приложений с помощью библиотек Boost.Thread и Boost.Asio

Написал небольшой сервер и тестирующий клиент к нему такой, что для обработки очередного подключения клиента

сервер создает отдельный поток. Столкнулся со следующей проблемой: после приблизительно пятисот успешных

циклов создания потока для подключившегося клиента и его завершения по окончании обработки запроса серверу

не удается создавать потоки более: вызывается исключение


terminate called after throwing an instance of

'boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector

<boost::thread_resource_error> >

what(): boost thread: failed in pthread_create: Resource temporarily unavailable


При этом при текущих значениях констант сервером не может быть создано более 10

потоков одновременно, а пользователь, от имени которого запускаются сервер и клиент,

не имеет никаких ограничений на число процессов или дескрипторов. Ни потоки, ни память в ходе работы не «текут» —

все корректно завершается и освобождается, корректно закрываются сокеты.


Более полное описание проблемы и исходные кода (а также статически слинкованные бинарники под linux x86-32) см. здесь


Как это побороть? Заранее спасибо.
  • Вопрос задан
  • 5514 просмотров
Пригласить эксперта
Ответы на вопрос 3
DurRandir
@DurRandir
Потому что вы делаете join только когда сервер заканчивает свою работу, для всех запущенных потоков сразу. Т.е. вы запустили N потоков, из них M свою работу закончили, но ресурсы вы за ними не прибрали.

A thread that has exited but remains unjoined counts against
[_POSIX_THREAD_THREADS_MAX].
© man pthread_join
Ответ написан
ixSci
@ixSci
Хотя я считаю, что Вы всё делаете не правильно, и что так вообще не елается. Вы можете воспользоваться функцией at_thread_exit(). Что позволит Вам детачить тред по его завершении. Как это сделать, уже решать Вам.
А вообще лучше сделать thread_pool и посылать в него запросы, и не морочить себе голову.
Ответ написан
Комментировать
ramntry
@ramntry Автор вопроса
Хорошо, спасибо. Вы не подскажете, где посмотреть, как делается правильно? В литературе удается найти только абстрактные простые примеры, к сожалению. Комбинаций организации сервера (процессы/потоки, они же — по одному на клиента или по числу ядер, пул потоков, select/pol, epoll, они же — руками или с помощью asio, poco и т.д. и т.п.) безумного много.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы