Ошибка Pthread_create 11 только с 5 одновременными потоками

У меня проблема в многопоточной программе. Моя программа имеет 4 потока, которые всегда здесь. Мы назовем эти потоки от 1 до 4.

Целью моей программы является связь через сокет с периферийным устройством. Поток номер 4 используется для отправки сообщений на периферийное устройство.

Каждый раз, когда сообщение отправляется на периферийное устройство, я использую:

pthread_create(&m_hThreadMsgReader, NULL, &ThreadMsgReader, (void*) &argStruct);

Это создаст поток для прослушивания ответа в сокете, этот поток вернется, когда сокет больше не содержит сообщения: т. е. ifiRet = recv(m_iSocket, pcRecBuf, DEFAULT_READ_DATA_LEN, 0); заставляет iRet принимать значение 0.

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

Проблема здесь в том, что через несколько часов pthread create вылетает с ошибкой 11. Я видел, что при переполнении стека это означает, что в системе может не хватить ресурсов или слишком много потоков.

Но я не понимаю, как в отладке QtCreator, я вижу только потоки с 1 по 4. Я знаю, что мог создать около 300 потоков, но список потоков содержит только 4, что означает, что все остальные потоки были завершены.

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

Должен ли я просто найти способ иметь один поток для прослушивания, даже если он будет прослушивать пустой сокет? Является ли моя реализация плохим шаблоном?


person djfoxmccloud    schedule 16.05.2013    source источник
comment
Сбой с ошибкой 11 — ошибка сегментации. Это вероятно не имеет ничего общего с нехваткой ресурсов любого рода, но вы обращаетесь к указателю, к которому не должны обращаться. Конечно, это произойдет, когда, например, произойдет сбой выделения памяти, и вы не проверите возвращенный указатель.   -  person Some programmer dude    schedule 16.05.2013
comment
Аналогичный вопрос задан здесь, stackoverflow.com/questions/622890/   -  person deepdive    schedule 16.05.2013
comment
Не нашел это в первый раз, Дивьянг, я собираюсь попробовать, спасибо за указатель, я свяжусь с вами, когда узнаю, сработало ли это.   -  person djfoxmccloud    schedule 16.05.2013
comment
Вы присоединяетесь к этим темам? или просто оставить их гнить?   -  person WhozCraig    schedule 16.05.2013
comment
Я подумал, что просто позволю им вернуться, и я просто прочитаю эту статью: domaigne.com/blog/computing/joinable-and-detached-threads Я понимаю, что использование атрибута detachable было тем, что я искал, теперь мне просто нужно подождать, пока моя программа достигнет то же состояние и посмотреть, работает ли он   -  person djfoxmccloud    schedule 16.05.2013


Ответы (1)


Вы должны вызвать pthread_join, чтобы освободить полученные ресурсы. Или вы можете использовать атрибут PTHREAD_CREATE_DETACHED в этом случае вам не потребуется использовать pthread_join

person deepdive    schedule 16.05.2013
comment
Вот пример создания потока в отдельном режиме: docs.oracle.com/cd/E19455-01/806-5257/attrib-69011/index.html - person matias.g.rodriguez; 15.08.2020