Próbuję wymyślić projekt puli wątków z wieloma wymaganiami projektowymi dla mojej pracy. Jest to prawdziwy problem dla działającego oprogramowania i jest to trudne zadanie. Mam działającą implementację, ale chciałbym rzucić to na SO i zobaczyć, jakie ciekawe pomysły mogą wymyślić ludzie, aby móc porównać z moją implementacją i zobaczyć, jak się układa. Próbowałem być tak dokładny, jak to tylko możliwe.Pula wątków do wykonywania arbitralnych zadań o różnych priorytetach
Pula wątków musi wykonać serię zadań. Zadania mogą być krótkie (< 1sec) lub długotrwałe (godziny lub dni). Każde zadanie ma przypisany priorytet (od 1 = bardzo niski do 5 = bardzo wysoki). Zadania mogą przychodzić w dowolnym momencie, podczas gdy inne zadania są uruchomione, więc po ich otrzymaniu pula wątków musi je wybrać i zaplanować je, gdy wątki staną się dostępne.
Priorytet zadania jest całkowicie niezależny od długości zadania. W rzeczywistości niemożliwe jest określenie, ile czasu może upłynąć zadanie, aby uruchomić go bez uruchamiania.
Niektóre zadania są związane z procesorem, a niektóre z nich są bardzo powiązane z IO. Nie da się wcześniej przewidzieć, jakie będzie dane zadanie (choć wydaje mi się, że możliwe jest wykrycie podczas wykonywania zadań).
Podstawowym celem puli wątków jest maksymalizacja przepustowości. Pula wątków powinna efektywnie wykorzystywać zasoby komputera. Idealnie, dla zadań związanych z CPU, liczba aktywnych wątków będzie równa liczbie procesorów. W przypadku zadań związanych z IO należy przypisać więcej wątków niż w przypadku procesorów, aby blokowanie nie miało nadmiernego wpływu na przepustowość. Ważne jest minimalizowanie użycia zamków i używanie bezpiecznych/szybkich pojemników z gwintem.
Generalnie powinieneś wykonywać zadania o wyższym priorytecie z wyższym priorytetem procesora (patrz: SetThreadPriority). Zadania o niższym priorytecie nie powinny "blokować" zadań o wyższym priorytecie przed uruchomieniem, więc jeśli zadanie o wyższym priorytecie pojawi się podczas wykonywania wszystkich zadań o niskim priorytecie, zadanie o wyższym priorytecie zostanie uruchomione.
Do zadań przypisany jest parametr "max running tasks". Każdemu typowi zadania można uruchomić najwyżej tyle jednoczesnych instancji zadania naraz. Na przykład, mamy następujące zadania w kolejce:
- A - 1000 przypadków - niskim priorytecie - max zgłoszenia 1
- B - 1000 przypadków - niskim priorytecie - max zadania 1
- C - 1000 instancje - niski priorytet - max zadania 1
Robocza realizacja mogła przebiegać (maksymalnie) 1 A, 1 B i 1 C w tym samym czasie.
Musi działać w systemie Windows XP, Server 2003, Vista i Server 2008 (najnowsze dodatki Service Pack).
Dla porównania, możemy kliknąć na poniższy interfejs:
namespace ThreadPool
{
class Task
{
public:
Task();
void run();
};
class ThreadPool
{
public:
ThreadPool();
~ThreadPool();
void run(Task *inst);
void stop();
};
}