ja widziałem to zrobić zarówno w systemie sprzed C++ 11 (gdzie w zasadzie wynalazł własną klasę wątku, który był bardzo podobny do std :: thread) iw jednym pisałem dość niedawno.
Zasadniczo pula naprawdę stawia std :: thread 2 layers down - masz klasę PoolThread, która zawiera std :: thread plus metadane, takie jak nazwa, ID, itd. Oraz strukturę kontrolną, która łączy ją z jej kontrolowanie puli i samego ThreadPool. Chcesz użyć puli wątków w większości kodu z gwintami z kilku powodów:
1) Możesz ukryć wszystkie wyraźne "odłączyć", "dołączyć", rozpocząć wątek na konstrukcji std :: thread, itp. Od użytkowników. To daje DUŻO bezpieczniejszy kod czyszczący &.
2) Lepsze zarządzanie zasobami: zbyt wiele wątków obniży wydajność nawet o więcej niż za mało. Dobrze zbudowany basen może robić zaawansowane rzeczy, takie jak automatyczne równoważenie obciążenia i czyszczenie zawieszonych lub zakleszczonych wątków.
3) Ponowne użycie wątku: std :: thread sam w sobie jest najłatwiejszy w użyciu, uruchamiając każde równoległe zadanie we własnym wątku. Ale tworzenie wątku jest bardzo kosztowne i może łatwo zepsuć zwiększenie prędkości z przetwarzania równoległego, jeśli nie jesteś ostrożny. Dlatego zwykle bardziej sensowne jest posiadanie wątków puli, które pobierają zadania robocze z kolejki i kończą tylko po otrzymaniu sygnału.
4) Obsługa błędów: std :: thread to tylko kontekst wykonania. Jeśli zadanie, które uruchamiasz, generuje nieobsługiwany wyjątek lub STD :: wątek ITSELF nie powiedzie się, proces się właśnie zawiesza.Aby wykonać wielowątkowość odporną na uszkodzenia, potrzebujesz puli lub czegoś podobnego, co może szybko przechwycić takie rzeczy i przynajmniej emitować znaczące komunikaty o błędach, zanim proces się zakończy.
W systemie Windows nazwa wątku jest właściwością debuggera (tj. Jest śledzona poza samą aplikacją). W rezultacie nie masz odpowiednika 'pthread_getname_np' – MSalters