W którym momencie wykonywana jest funkcja przez określony wątek?

0

W którym momencie wykonywana jest funkcja przez określony wątek? Czy dopiero po ustawieniu priorytetu za pomocą metody ?

pthread_setschedparam()

czy w momencie tworzenia instancji?

this->hread = new std::thread(&Streamer::fameAcquireThread,this);

Im większy priorytet ma wątek tym ważniejszy jest? (Jeżeli tak to czy to znaczy, że jako pierwszy sie wykona?)

0

W momencie utworzenia obiektu std::thread startuje wątek.

0

Mieszasz posixowe api z biblioteką standardową.

W którym momencie wykonywana jest funkcja przez określony wątek?

Zapis this->hread = new std::thread(&Streamer::fameAcquireThread,this); spowoduje wystartowanie wątku, jeśli nic nie blokuje funkcji to można zakładać że w tym miejscu zaczyna się wykonywać.

Priorytet możesz ustawić po wystartowaniu wątków, jak w PRZYKŁADZIE, ale wcale nie masz gwarancji, że funkcja z niższym priorytetem zakończy się później niż ta z wyższym. Wątek z wyższym priorytetem będzie miał pierwszeństwo przed wątkiem z niższym priorytetm, jeśli dojdzie do konieczności dzielenie zasobów CPU. Czyli jeśli np. nie trzeba będzie dzielić zasobów i wątek z niższym priorytetem będzie potrzebował mniej cykli do zakończenia pracy wtedy może zakończyć się szybciej niż ten z wyższym priorytetem.

0

Czyli nie ma mozliwosci ustawienia priorytetu wątku w momencie tworzenia instancji watku?

0

Nie jestem świadom takiej możliwości używając standardowej biblioteki. Używając bezpośrednio API posixa jesteś w stanie to zrobić, nowy wątek dziedziczy domyślne właściwości wątku który go tworzy. Z tego co pamiętam to te dziedziczone właściwości można ustawić.

EDIT
Miałem rację. W wątku z którego zamierzasz stworzyć nowy wątek wywołujesz funkcję z podlinkowanej dokumentacji i ustawiasz dziedziczone atrybuty z opcją PTHREAD_EXPLICIT_SCHED wtedy nowy wątek stworzony przez pthread_create użyje tych właśnie atrybutów.

0

Oki. Czyli ustawianie priorytetu wątku należy zrobić w funkcji, która dany wątek wykonuje? (Jeżeli niedziedzicze wątkow)

0

Jeżeli niedziedzicze wątkow

Nie pisałem nigdzie o żadnym dziedziczeniu wątków, pisałem o dziedziczeniu właściwości z wątku głównego do potomnego.

Czyli ustawianie priorytetu wątku należy zrobić w funkcji, która dany wątek wykonuje?

Co? To wątek wykonuje operacje/funkcje a nie na odwrót. A priorytet wątku potomnego możesz ustawić w wątku głównym zanim ten potomny stworzysz. Tak przynajmniej jest w POSIX, czy i jak jest możliwe w windowsie.

1

Wbrew pozorom pytanie jest inne. Brzmi ono raczej dlaczego chcesz używać priorytetów wątków? W większości zastosowań wystarczają mechanizmy synchronizacji dostarczane przez bibliotekę standardową (włącznie z ew. CV, std::atomic, kolejkami/kolejkami bezpiecznymi wielowątkowo/kolejkami priorytetowymi ew. wzorcem thread pool). Dotykając priorytetów generujesz sobie wiele problemów utrzymaniowych i wydajnościowych (np. "bo mi zmienili w instalacji tego Linuksa polityki szeregowania i .. nie działa").
W tych przypadkach w których jesteś absolutnie pewien że możesz zaufać systemowi operacyjnemu co do priorytetów (i rozumiesz że ryzykujesz pojęcie zagłodzenia oraz wiesz że ... nie wystąpi), możesz:

  1. wystartować wątek i zatrzymać go na CV (condition vriable),
  2. ustawić mu priorytet z użyciem mechanizmów systemowych prosząc przez native_handler() o obiekt systemowego wątku.
  3. powiadomić wszystkie które utknęły na CV żeby ruszyły...

To jedno z bardzo wielu rozwiązań.... i wcale nie idealne/uniwersalne.

1

Nie wiem co mówi na ten temat standard, ale założę się, że moment wystartowania funkcji przez wątek pozostaje niezdefiniowana.
System, może priorytezować wątki w rożny sposób, przez co opóźnienie może być dość duże.

Standard C++ nie przewiduje zmiany priorytetu wątku. Można skorzystać z API systemowego, bo dostępny jest uchwyt wątku, ale to czyni kod powiązanym z danym systemem.

Podejrzewam problem XY, dlatego lepiej będzie jeśli opiszesz jaki masz problem (a nie jak chcesz go rozwiązać).

0

To jest tak poważne ograniczenie że nasuwa się przypuszczenie że ktoś przez te 7 lat to już rozwiązał.

Znalezione rozwiązania:
https://stackoverflow.com/a/31652324 (pthread)
https://stackoverflow.com/a/14477950 (Windows)

Przy okazji, nie związane, ale zostawiam - CPU affinity:
https://eli.thegreenplace.net/2016/c11-threads-affinity-and-hyperthreading/

(przy czym to są rozwiązania działające po odpaleniu wątku)

0

Tak na poboczu: new std::thread - a komu to potrzebne? A dlaczego?

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