[Pula wątków] powiadomienie o zakończeniu zadania

0

Cześć, witajcie,

w ramach ćwiczeń, zacząłem pisać własną pule wątków.
Pomysł mam podobny do tego, który można spotkać w Qt, czyli do puli wrzucamy klasę, która dziedziczy po interfejsie np.Runnable i ma metodę czysto wirtualną run()

W implementacji mam dwie kolejki:

  • Z zadaniami (obiektami zadań) do uruchomienia
  • Z wątkami, które te zadania obsługują

Moje pytanie brzmi: jak dowiedzieć się o tym, że dany wątek skończył wykonywać metodę run() i może przyjąć kolejne zadanie?
Pytanie pewnie trywialne jak otworzy mi się jakaś furtka w głowie ^^

Dzięki z góry!

2

jak dowiedzieć się o tym, że dany wątek skończył wykonywać metodę run() i może przyjąć kolejne zadanie?

Nie potrzebujesz żadnej jawnej informacji, czy zadanie się skończyło. Idea thread poola polega na tym, że masz ileś tam wątków, które jednocześnie, cały czas zbierają zadania z kolejki. Czyli masz funkcję/metodę z nieskończoną pętlą pseudokod

void loop()
{
    for(;;)
    {
       if(stop)
          break;

       {
            lock<mutex> lock(queueMutex);
            waitUntiQueueNotEmpty(lock)
            job = queue.take();
       }
       job();
    }
};

I teraz jak job() sie kończy pobierasz kolejny element. To wszystko. Taką funkcję "wrzucasz" do każdego wątku. Nie potrzebujesz tutaj żadnego jawnego trigera, flagi ani eventu.

1

A nie lepiej, żeby wątek sam sobie zadanie brał?
Ogólny koncept jest taki, że jest jedna kolejka z zadaniami i workery sobie z niej biorą zadania do wykonania. Natomiast przy dużej ilości tych workerów możesz mieć problem z rywalizacją o dostęp do tej kolejki.
Zajrzyj też tu: https://blog.molecular-matters.com/2015/08/24/job-system-2-0-lock-free-work-stealing-part-1-basics/
Tam jest trochę bardziej złożony koncept - każdy wątek ma swoją kolejkę, do której zadania pcha jakiś scheduler (wątek główny np.) oraz one same w razie potrzeby. Gdy dany wątek nie ma w danej chwili nic do roboty, wtedy "kradnie" ją od innego wątku. Całkiem ciekawy pomysł IMHO.

0

Dziękuję Wam za odpowiedź, obie były bardzo pomocne.
Zupełnie nie pomyślałem o tym, żeby wrzucić do wątku moją funkcję, która to dopiero handluje poszczególne metody :)

Dzięki!

1 użytkowników online, w tym zalogowanych: 0, gości: 1