2009-03-08 17 views
6

Mam pewne kłopoty z moim pierwszym wypadkiem w wątki w C. Próbuję (na razie) napisać bardzo prosty program serwera, który akceptuje połączenie przez gniazdo i uruchamia nowy wątek, aby go przetworzyć. Wydaje się działać dobrze, z wyjątkiem tego, że utworzy tylko około 300 wątków (303, czasem 304), zanim pthread_create() nie powiedzie się z kodem EAGAIN, co oznacza:Dlaczego funkcja pthread_create() miałaby awarię z tylko dwoma wątkami?

"System nie ma niezbędnych zasobów do utworzenia kolejnego wątku, lub nałożony na system limit łącznej liczby wątków w procesie {PTHREAD_THREADS_MAX} zostanie przekroczony. "

To jest nie 303 wątków w tym samym czasie - każdy wątek wychodzi, co jest potwierdzane przez gdb. Za każdym razem, gdy wywoływana jest funkcja żądania procesu, działają dwa wątki.

Oznacza to, że "system nie ma niezbędnych zasobów". Moje pytanie jest (i może być trochę głupie) - jakie są te zasoby? Prawdopodobnie jest to przeciek pamięci w moim programie (na pewno możliwy, prawdopodobnie nawet), ale pomyślałbym, że mimo to może zarządzać ponad 300, biorąc pod uwagę, że reszta programu robi bardzo niewiele.

Jak mogę sprawdzić, ile pamięci mój program ma do dyspozycji, aby potwierdzić, że jej nie ma? Pamięć jest wolna i wolna od wymiany, więc prawdopodobnie istnieje sztuczny limit narzucony przez system operacyjny (Linux).

Dzięki

+0

można dodawać fragment kodu, który tworzy i niszczy wątki? –

Odpowiedz

10

Jeśli nie tworzą nić z atrybutem PTHREAD_CREATE_DETACHED (lub odłączania ich pthread_detach() może trzeba zadzwonić pthread_join() każdego utworzonego wątku po jej wysunięciu, aby zwolnić zasoby związane z nim.

+0

Dziękuję! Po prostu ustaw ten atrybut, a minęło już ponad 4000 wątków i liczenie. Wielkie dzięki - naprawiono około 3 godziny frustracji :) – Ray2k

0

Ewentualnie trochę przesadą (?) Ale Valgrind może pomóc zlokalizować memleaks w Linuksie.

Czy może chcesz opublikować niektóre fragmenty kodu? Najlepiej części, w których przydzielasz/zwalniasz pamięć/gniazda i gdzie tworzysz swoje wątki.

Powiązane problemy