Jak sprawdzić czy uruchomiony wątek jeszcze działa czy już się zakończył ?

0

Potrzebuje stworzyć przykładowy testowy program który:

  1. Sprawdzi co 15 sekund czy wątek nadal działa jesli nie to ponownie go uruchamia
  2. Uruchomiony wątek działa do czasu wykonania pracy może to zając dla przykładu 14 sekund lub 16 sekund
    nastepnie zakończy sam siebie
  3. Jesli zajmie 14 sekund to funkcja w głównym wątku main ponownie go uruchomi
  4. Jeżeli zajmie to 16 sekund to funkcja w głównym wątku nie uruchomi go przez następne 15 sekund

W związku z tym zrobiłem prosty program ale działa on na zasadzie flagi.
Wątek dodakowy przestawia flagę na true i wtedy główny program wie, że
dany wątek jest uruchomiony a po zakończeniu przestawia go na false

Czy jesty jakieś inne roziazanie nie wiem może jest w standardzie
jakaś informacja o wątkach jakaś tablica uruchomionych wątków i zamiast
flagi tam bym sprawdzał? czy ta flaga jednak to dobre wyjście ?

Znalazłem dobry materiał tutaj: http://www.zsk.ict.pwr.wroc.pl/zsk/repository/dydaktyka/so/watki.html
Ale nie wiem jak to wykorzystać do mojego zadania.

Poniżej mój przykładowy kod:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>

using namespace std;

pthread_t threadRuningTest;
bool isTestRun;


void *RuningTest(void *) {
	isTestRun = true;
	/* make some code */
	isTestRun = false;
	sleep(14);
	//sleep(16);
	pthread_exit(0); 
}

int main(void) {
	cout << "main" << endl;
	/* start testthread */
	while(true){
		if (isTestRun == false) { 	
			/* test run*/
			pthread_create( &threadRuningTest, NULL, &RuningTest, NULL);
		}
		sleep(15);
	}	
}
0

A nie możesz po prostu zrobić join() na wątku? W ten sposób poczekasz aż wątek się skończy i odpalisz go ponownie...

0

No właśnie nie rozumiem tego join ? ale jeśli wątek się będzie wykonywał 130 sekund to w między czasie odpalą się 3 oczekujące wątki lub więcej czy jak to zrobić z tym joinem ?

1

Nie rozumiem pytania. Tworzysz wątek, a potem robisz

pthread_join(thread_id,NULL);

i program będzie w tym miejscu stał i czekał aż wątek się zakończy.

0

a skąd wziąć to id wątku i to id wątku jest id nowego co ma powstać czy id obecnego?
i co się stanie jak wątek zakończy się za 5 sekund po wystartowaniu a ja chce żeby co 15 sekund startował
a z tego co wynika to on czeka aż się zakończy poprzedni i startuje.
A co będzie jak wątek się skończy za 7 sekund po uruchomieniu a za 15 sekund zrobię ten join a wątku już nie będzie to skąd wziąć to id przy robieniu join i czy ja nie znajdzie tego TDI to wystartuje mi watek ponownie?

0

OMG a umiesz łaskawie czytać? Czy dokumentacja gryzie?

  1. Skąd wziąć ID wątku? Przeczytać łaskawie w dokumentacji o pthread_create()
  2. To ja w ogóle nie rozumiem. Najpierw piszesz że chcesz uruchamiać nowy wątek zaraz po zakończeniu poprzedniego, a teraz piszesz o startowaniu wielu wątków. Zdecyduj się! W przypadku join() w ogóle nie musisz robić żadnych sleepów przecież, ot po prostu czekasz aż wątek się skończy. Ale możesz znów przeczytać w dokumentacji jak ustawić co ma się dziać jeśli zrobić join() na już skończonym wątku.
0

W skrócie chciałbym by było tak:

  1. Uruchamiam program
  2. Uruchamia się wątek
  3. Odlicza się timer 15 sekund.
  4. Jeśli po odliczeniu watek nadal dziala nie rob nic
  5. Jesli po odliczeniu watek juz nie dziala uruchom go ponownie
    I dlatego potrzebuje wykryc tylko czy watek dziaal czy nie.
    moze zamiast flagi da sie zrobic to jakos sprawdzajac ID WATKOW
    jesli dany ID jest to znaczy ze watek dziala a jesli nie ma to
    znaczy ze nie dziala i trzeba zrobic nowy.
0

Ale po co ten timer? Nie może być po prostu tak że jak wątek skończy pracę to odpalasz nowy? Czy te 15 sekund to jakaś świętość?

0

Chodzi o to ze system zbiera dane do bazy w czasie 15 sekund i dopiero wtedy moga trafic do programu zeby je przeparsowac i dalej przerzucic. Te odcinki czasu da wazne bo sa punktem odniesienia do statystyk. Inaczej dalbym to wszystko w oddzielnym watku w petli while(true) i co chwila by te dane parsowalo ale to niestety nie pomoze :( wiec na razie zostaje mi rozwiazanie z flaga

0

Poczytaj http://pubs.opengroup.org/onlinepubs/000095399/xrat/xsh_chap02.html#tag_03_02_08_21 "lepsiejsze" rozwiązanie z flagą.

A tak ogólnie to po co wątek? Zapisujesz czas startu twojej funkcji, po jej zakończeniu obliczasz czas jej trwania (currentTime-startTime) i warunek if t > 15 then sleep(15). Btw dziwnie zbierasz te statystyki, jeśli funkcja będzie trwać raz 18 sekund, a potem 22 sekundy to i tak będziesz czekał 15 sekund?

0

Jeżeli funkcja nie zmieści się w czasie 15 sekund wtedy zestawienie będzie zaweierac dane z 30 sekund. Jesli nie zmiesci sie w 30 sekundach no to w 45 i wyciągnę średnią.

0

Mr Obvious dobrze mówi, że nie potrzebujesz wątków.

for ...
start = czas_aktualny()
pobierz_statystyki()
czas = czas_aktualny() - start
zapisz_statystyki(max(czas, 15s)) <--- tutaj zapisujemy statystyki wraz z czasem jaki nam zabrało ich zebranie by wyciągnąć średnią
if czas < 15s then sleep(15s - czas)

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