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
Не го намерих първия път, Divyang, ще го пробвам, благодаря за насоката, ще се свържа с вас, когато разбера дали работи   -  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