W jaki sposób można zaimplementować pulę wątków? Czytałem na Wikipedii hasło „Threadpool”, ale nadal nie mogę „dowiedzieć się, co należy zrobić, aby rozwiązać to pytanie (być może dlatego, że nie bardzo rozumiałem, czym jest pula wątków w prostych słowach).
Czy ktoś może wyjaśnić mi po angielsku, czym jest pula wątków i jak można odpowiedzieć na to pytanie?
Odpowiedź
Wątek Pula to grupa wstępnie utworzonych, bezczynnych wątków, które są gotowe do wykonania pracy. Są one preferowane zamiast tworzenia instancji nowych wątków dla każdego zadania, gdy istnieje duża liczba krótkich zadań do wykonania, a nie niewielka liczba długich. Zapobiega to konieczności ponoszenia narzutów związanych z tworzeniem wątku wiele razy.
Implementacja 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 czekać na barierę, aż pula zacznie działać. (Można to zrobić za pomocą muteksów również.)
- Kontener do przechowywania utworzonych wątków, taki jak kolejka lub inna struktura, która umożliwia dodanie wątku do puli i wyciągnięcie jednego.
- Standardowy interfejs lub abstrakcyjna klasa dla wątków do wykorzystania w pracy. Może to być klasa abstrakcyjna o nazwie
Task
z metodąexecute()
, która wykonuje pracę, a następnie zwraca.
Po utworzeniu puli wątków albo utworzy wystąpienie określonej liczby wątków, aby udostępnić, albo utworzy nowe w zależności od potrzeb implementacji.
Gdy pula jest przekazywana Task
, pobiera wątek z kontenera (lub czeka, aż będzie dostępny, jeśli kontener jest pusty), wręcza mu Task
, i napotyka barierę. Powoduje to, że bezczynny wątek wznawia wykonywanie, wywołując metodę execute()
podanej Task
. Po zakończeniu wykonywania wątek podaje się z powrotem do puli, aby umieścić go w pojemniku w celu ponownego użycia, a następnie napotyka barierę, usypiając, dopóki cykl się nie powtórzy.
Komentarze
- Pula wątków to grupa wstępnie utworzonych, bezczynnych wątków, które są gotowe do wykonania. […] Dzięki temu nie trzeba wiele razy ponosić kosztów związanych z tworzeniem wątku. – Google powinno to wypluwać za każdym razem, gdy ktoś szuka wątku ” pula ”
- Czy tworzenie puli wątków wiąże się z wewnętrzną barierą? Czy możesz udostępnić referencje w tych wierszach?
- @overexchange Nie, nie. Moje odniesienie do tego pytania było przykładem lepszego sposobu ponownego napisania pytania o barierę . (Jeśli tak, napiszę odpowiedź).
- jedna z najlepszych krótkich odpowiedzi.
Odpowiedź
Pula wątków to zbiór zarządzanych wątków zwykle zorganizowanych w kolejkę, które wykonują zadania w kolejce zadań.
Tworzenie nowego obiektu wątku za każdym razem, gdy trzeba coś wykonać asynchronicznie, jest kosztowne. W puli wątków wystarczy dodać zadania, które mają być wykonywane asynchronicznie do kolejki zadań, a pula wątków zajmie się przypisaniem dostępnego wątku, jeśli istnieje, dla odpowiedniego zadania. Jak tylko zadanie zostanie zakończone, teraz dostępny wątek żąda kolejnego zadania (zakładając, że został jakikolwiek).
Pula wątków pomaga uniknąć tworzenia lub niszczenia większej liczby wątków, niż byłoby to naprawdę konieczne.
Zacząłbym od stworzenia klasy z kolejką wątków i kolejką zadań. Następnie zaimplementuj metodę, która dodaje zadanie do kolejki zadań i przejdź dalej. Oczywiście powinieneś także umożliwić ustawienie maksymalnej dozwolonej liczby wątków w puli wątków.
Odpowiedź
Przykład z życia wzięty;
- Narzędzie: system operacyjny
- Sekcje: Aplikacje
- Ludzie: Wątki
Masz tam zakład Pracuje 12 osób. Istnieją 3 sekcje tego obiektu. Kuchnia, toalety i ochrona. Jeśli nie używasz techniki puli wątków, tak to działa: wszystkie 12 osób będzie stać w sali konferencyjnej, jeśli nowi klienci przyjdą do obiektu i poproszą o zadania, wtedy rozdzielisz ludzi na grupy i wyślesz ich do wykonania pracy i wracają do sali konferencyjnej. Ale zanim pójdą na swoje obowiązki, jest faza przygotowań. Muszą założyć odpowiedni mundur, wyposażyć się w określone urządzenia i przejść do tej sekcji, zakończyć pracę i wrócić. za każdym razem, gdy kończą pracę (wątek się kończy), muszą iść z powrotem do sali konferencyjnej, rozebrać mundur, wyjąć sprzęt i czekać na następne zadanie. Dotyczy to tworzenia kontekstu wątku, alokacji pamięci i śledzenia informacji przez system operacyjny.Ponowne uporządkowanie nowych potrzeb wątków jest zbyt czasochłonne dla systemu operacyjnego.
Jeśli korzystasz z puli wątków, to wczesnym rankiem przydzielisz 6 osób do kuchni, 2 do toalety i 4 osoby do ochrony. Dlatego będą przygotowywać się tylko raz dziennie. Nawet jeśli w kuchni nie ma klientów, te 4 osoby będą tam pracowały bezczynnie przy wszelkich nadchodzących zadaniach. Nie muszą wracać do pokoju konferencyjnego, dopóki kuchnia nie zostanie zamknięta (aplikacja się skoń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 ochrony.
W pierwszym scenariuszu nie marnujesz żadnego wątku na żadne zadanie, ALE przygotowanie każdego wątku do każdego zadania zajmie dużo czasu. W drugim przypadku 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 przeważnie optymalizuje go, więc możesz bezpiecznie na nim polegać.
Odpowiedź
W aplikacji wielowątkowej pula wątków to „pula dostępnych wątków”, z której może korzystać Twoja aplikacja. Zwykle np. NET, wszystko jest zarządzane, więc po prostu przydzielasz zadania i gdy wątek zostanie zwolniony, będzie to wykonywał. Aby zaimplementować pulę wątków, spodziewałbym się stworzenia koncepcji, w której zadania są automatycznie podejmowane przez wolne wątki bez jawnego tworzenia wątków dla każdego zadania.