2009-12-22 13 views
11

Czy można w jakikolwiek sposób zmienić limit liczby pthreadów, które proces może utworzyć? Obecnie na moim systemie Linux mogę utworzyć około 380 wątków, ale chcę to zwiększyć, jeśli tylko pamięć jest dostępna.Zmiana limitu maksymalnej liczby pthreadów przez aplikację

+2

Ciekawe ... masz uważane za jedne z konsekwencjami takich projekt systemu? Pojedynczy punkt awarii (SPOF) przychodzi na myśl. – jldupont

+0

Nie jestem ekspertem, ale założę się, że posiadanie ponad 380 wątków przytłoczy twój procesor przełącznikami kontekstowymi. Przełączanie kontekstu dla wątku jest mniejsze niż w przypadku oddzielnego procesu, ale nadal musisz zapisać licznik programu i zarejestrować plik oraz być może inne rzeczy, których zapominam. Ile wątków potrzebujesz? Sugerowałbym profilowanie aplikacji, aby określić obciążenie wątku dla 10 wątków w porównaniu do 100 wątków, a następnie spróbuj ekstrapolować do docelowej liczby wątków. Może się okazać, że nie jest to warte wysiłku. A może po prostu jestem w błędzie ... –

+0

Nie będę go używać praktycznie nigdzie ... ale potrzebuję go do pewnych eksperymentów? – Sukanto

Odpowiedz

1

Spójrz na to:

Maximum number of threads per process in Linux?

i spojrzeć na to jak to może odnosić się do pytania:

Serve one client with each server thread

+0

' kota?/proc/sys/kernel/threads-max' pokazuje '16384' .Ale nie mogę utworzyć więcej niż 380 pthreadów, próbowałem nawet wstawić pustą funkcję jako treść wątków – Sukanto

+0

jaki błąd dostałeś? –

+0

po 380 wątkach otrzymuję 'EAGAIN' jako wartość zwracaną' pthread_create() ', która zgodnie z' pthread_create() 'man page jest" W systemie brakowało niezbędnych zasobów do utworzenia innego wątku lub nałożonego przez system ograniczenia na całkowita liczba wątków w procesie {PTHREAD_THREADS_MAX} zostałaby przekroczona. " – Sukanto

3

Twoim problemem jest to, że nie nazwali pthread_detach na wątki, o których mowa. To mówi pthread, że zasoby związane z każdym wątkiem zostaną zwolnione po zakończeniu wątku. Musisz wywołać pthread_join lub pthread_release we wszystkich wątkach, aby zwolnić zasoby wątku. Oznacza to, że musisz również wywołać pthread_detach w swoich programach obsługi anulowania pthread_join lub wycieku.

6

zmniejszyć rozmiar stosu użytkownika "ulimit -s 1024";

default: 8MB 
reduced: 1MB 

do zwiększenia liczby wątków.

ustawić rozmiar stosu: pthread_attr_setstacksize(1024)

Powiązane problemy