Co to jest pula wątków?


62

Jak wdrożyć pulę wątków? Czytałem na Wikipedii „pula wątków”, ale nadal nie mogę się dowiedzieć, co należy zrobić, aby rozwiązać to pytanie (być może dlatego, że nie do końca rozumiem, co to jest pula wątków).

Czy ktoś może mi wyjaśnić prostym językiem angielskim, czym jest pula wątków i jak można odpowiedzieć na to pytanie?

Odpowiedzi:


96

Pula wątków to grupa wstępnie utworzonych, nieaktywnych wątków, które są gotowe do wykonania pracy. Są one lepsze niż tworzenie nowych wątków dla każdego zadania, gdy do wykonania jest duża liczba krótkich zadań, a nie niewielka liczba długich. Zapobiega to ponoszeniu nakładów związanych z tworzeniem wątku wiele razy.

Wdrożenie będzie się różnić w zależności od środowiska, ale w uproszczeniu potrzebujesz:

  • Sposób tworzenia wątków i utrzymywania ich w stanie bezczynności. Można to osiągnąć, każąc każdemu wątkowi poczekać na barierę, aż basen poda jej działanie. (Można to również zrobić z muteksami.)
  • Kontener do przechowywania utworzonych wątków, takich jak kolejka lub inna struktura, która ma sposób na dodanie wątku do puli i wyciągnięcie go.
  • Standardowy interfejs lub klasa abstrakcyjna dla wątków używanych podczas wykonywania pracy. Może to być klasa abstrakcyjna wywoływana Taskza pomocą execute()metody, która wykonuje pracę, a następnie zwraca.

Po utworzeniu puli wątków zostanie utworzona instancja określonej liczby wątków, aby ją udostępnić, lub utworzone nowe, zależnie od potrzeb implementacji.

Kiedy pula zostanie podana a Task, pobiera nić z pojemnika (lub czeka, aż stanie się dostępna, jeśli pojemnik jest pusty), wręcza a Taski napotyka barierę. Powoduje to, że wątek bezczynny wznawia wykonywanie, wywołując podaną execute()metodę Task. Po zakończeniu wykonywania nić oddaje się z powrotem do puli, która ma zostać umieszczona w pojemniku w celu ponownego użycia, a następnie napotyka barierę, kładąc się spać, aż cykl się powtórzy.


19
Pula wątków to grupa wstępnie utworzonych, nieaktywnych wątków, które są gotowe do wykonania pracy. [...] Zapobiega to ponoszeniu nakładów związanych z tworzeniem wątku wiele razy. - Google powinno to wypluć za każdym razem, gdy ktoś wyszukuje hasło „pula wątków”
Rafael Eyng

Czy tworzenie puli wątków wiąże się wewnętrznie z barierą? Czy możesz udostępnić referencje na tych liniach?
nadmierna wymiana

@overexchange Nie, nie ma. Moje odniesienie do tego pytania było przykładem lepszego sposobu na ponowne sformułowanie pytania barierowego . (Jeśli tak, napiszę odpowiedź.)
Blrfl,

jedna z najlepszych krótkich odpowiedzi.
Blood-HaZaRd

10

Pula wątków to zbiór zarządzanych wątków zwykle zorganizowanych w kolejce, które wykonują zadania w kolejce zadań.

Tworzenie nowego obiektu wątku za każdym razem, gdy potrzebujesz wykonać coś asynchronicznie, jest kosztowne. W puli wątków wystarczy dodać zadania, które mają zostać wykonane asynchronicznie, do kolejki zadań, a pula wątków zajmuje się przypisaniem dostępnego wątku, jeśli taki istnieje, do odpowiedniego zadania. Jak tylko zadanie zostanie zakończone, dostępny wątek zażąda innego zadania (zakładając, że zostało jakieś).

Pula wątków pomaga uniknąć tworzenia lub niszczenia większej liczby wątków, niż byłoby to naprawdę konieczne.

Zacznę od stworzenia klasy z kolejką wątków i kolejką zadań. Następnie zaimplementuj metodę, która dodaje zadanie do kolejki zadań i przejdź od tego miejsca. Oczywiście należy również umożliwić ustawienie maksymalnej dozwolonej liczby wątków w puli wątków.


1

W aplikacji wielowątkowej pula wątków to „pula dostępnych wątków”, z których może korzystać aplikacja. Zazwyczaj, np. .NET, wszystko jest zarządzane, więc po prostu przypisuj zadania, a gdy wątek będzie wolny, wykona go. Aby wdrożyć pulę wątków, spodziewałbym się stworzyć koncepcję, w której zadania są automatycznie podejmowane przez wolne wątki bez jawnego tworzenia wątków dla każdego zadania.


1

Przykład z życia;

  1. Obiekt: system operacyjny
  2. Sekcje: Aplikacje
  3. Ludzie: wątki

Masz placówkę, w której pracuje 12 osób. Istnieją 3 sekcje tego obiektu. Kuchnia, toalety i bezpieczeństwo. Jeśli nie użyjesz techniki puli wątków, tak to działa: wszystkie 12 osób będzie stać w pokoju konferencyjnym, jeśli nowi klienci przyjdą według placówki i poproszą o zadania, to rozdzielisz osoby w grupach i wyślesz je do pracy i wróć do pokoju konferencyjnego. Ale zanim przejdą do służby, następuje faza przygotowawcza. Muszą nosić odpowiedni mundur, wyposażyć niektóre urządzenia i przejść do tej sekcji, dokończyć pracę i wrócić. Dlatego za każdym razem, gdy kończą pracę (kończą się nici), muszą wracać do pokoju konferencyjnego, rozbierać mundur, wyjmować sprzęt i czekać na następną pracę. Odnoszą się one do tworzenia kontekstu wątku, jego alokacji pamięci i informacji śledzenia przez system operacyjny.

Jeśli używasz łączenia wątków, wczesnym rankiem przypiszesz 6 osób do kuchni, 2 osoby do toalety i 4 osoby do ochrony. Więc będą przygotowywać się tylko raz dziennie. Nawet jeśli w kuchni nie ma klientów, te 4 osoby będą na biegu jałowym, czekając na nadchodzące zadania. Nie muszą wracać do pokoju konferencyjnego, dopóki kuchnia się nie zamknie (aplikacja się kończy). Te 4 osoby znajdują się w puli aplikacji Kuchnia i są gotowe do szybkiego podania. Ale nie możesz obiecać, że pracują cały dzień, ponieważ kuchnia może od czasu do czasu stać się bezczynna. Ta sama logika dotyczy również toalet i bezpieczeństwa.

W pierwszym scenariuszu nie marnujesz żadnego wątku na żadne zadanie, ALE przygotowanie każdego wątku na każde zadanie zajmie dużo czasu. Po drugie, przygotowujesz wątki z wyprzedzeniem, więc nie możesz zagwarantować, że będziesz używać wszystkich wątków do wszystkich zadań, ale system operacyjny głównie dokonuje na nim wielkiej optymalizacji, więc możesz na nim bezpiecznie polegać.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.