2010-10-14 7 views
8

Co się dzieje, gdy próbuję odrodzić się za dużo?Ile wątków mogę odrodzić, używając doładowania w C++?

Dostaję następujący błąd podczas tarła więcej niż około 900 wątków:

terminate called after throwing an instance of 'dining 1 
boost::exception_detail::clone_impl<boost::exception_detail::error_info_injector<boost::thread_resource_error> 
>dining 3 
' 
dining 2 
    what(): dining 4 
boost::thread_resource_errordining 3 

Jest to oczekiwany błąd wynikający z przystąpieniem do tarła zbyt wiele wątków?

+0

Prawdopodobnie istnieje ograniczenie systemu operacyjnego. Sprawdź w instrukcji obsługi swojego systemu. –

+1

Po prostu nie interesuje nas, do czego służą te wątki? –

+0

@Mark: wygląda jak instancja Jadło Philosophy z 900 wątków. –

Odpowiedz

9

Pamiętaj, że każdy wątek musi zarezerwować przestrzeń stosu. Dlatego istnieje ograniczenie liczby wątków, które możesz odrodzić. Wygląda na to, że trafiasz w ten limit, lub zwiększenie to powstrzymuje cię przed osiągnięciem tego limitu.

Tu jest link do najnowszej dokumentacji doładowania, które dokumentuje zachowanie widzisz (wyjątkiem rzucony): boost thread docs (poszukiwanie boost :: thread_resource_error na tej stronie)

4

Liczba możliwych do odrodzenia zależy od ograniczeń środowiska operacyjnego. I tak, boost::thread_resource_error jest tym, czego powinieneś się spodziewać, gdy nie może uzyskać odpowiednich zasobów wątków, których potrzebuje, per the documentation

+1

Nawiasem mówiąc, mam głupie pytanie. Ile to będzie w systemie Windows? Około 10? 50? 100? 1000? 10000? –

+0

Wszystko zależy od wielu rzeczy. Ile masz pamięci, jeśli są jakieś ograniczenia na poziomie systemu operacyjnego itp. Ogólna odpowiedź brzmi: "prawdopodobnie co najmniej 1 (ale musisz sprawdzić) i może dużo więcej" –

+0

Powiem inaczej .Czy realistyczne jest uruchamianie wątków o wielkości 10K w oknach w jednym procesie? –

0

istnieją granice systemu operacyjnego. To głównie sprowadzi się do ilości pamięci w twoim systemie. Jeśli dobrze pamiętam, każdy wątek pthread ma co najmniej 32 megabajty pamięci. Domyślnie jest o wiele więcej.

1

Uderzasz w twardy limit. Jak inni twierdzą mogą być dwa ograniczenia:

  • liczba wątków proces można mnożyć jest ograniczona przez system operacyjny (albo globalnie, albo na proces)
  • pamięć jest dostępna ograniczona, każda nitka zachowuje swoje własne stos (zwykle kilka MB i 4 MB * 900 -> 3,6 Go)

Nawiasem mówiąc, to właśnie jest tak interesujące w procedurach Google Go. Zamiast tworzyć jak najwięcej wątków, środowisko wykonawcze Go dostosuje liczbę wątków do liczby dostępnych rdzeni i ręcznie zmultiplikuje procedury na tych fizycznych wątkach.

Co więcej, procedury są lekkie (zachowują tylko 4 KB), ponieważ nie używają tradycyjnego stosu (zniknięcie przepełnienia stosu!), Co oznacza, że ​​można skutecznie rozprowadzić kilka tysięcy procedur na typowej maszynie i to nie będzie cię wiele kosztowało.

Jeśli chcesz eksperymentować z ekstremalnej równoległości:

  • znaleźć sposób, aby zmniejszyć przestrzeń stosu przydzieloną za gwintu (strzeż przepełnienie stosu)
  • przełącznik Go, albo znaleźć inny język rutyny
  • realizacji
Powiązane problemy