wątki, SIGCHLD i waitpid



Widzisz wersję archiwalną tematu "wątki, SIGCHLD i waitpid" z forum pl.comp.programming





Hannibal - 29 Lis 2004, 13:57

Problemik dotyczy oczywiście o Linuksa.
Sorki ale miało to pójść na p.c.o.l.p :P, ale skoro już tu wysłałem to
czekam na odpowiedzi :)


Hannibal - 29 Lis 2004, 13:23

Witam

Mam pewne wątpliwości dotyczące wątków, których man nie rozwiał :( . Więc
mam kilka pytań. Ale na początek opis sytuacji.

Powiedzmy że główny wątek programu stworzył kilka wątków potomnych przy
pomocy pthread_create i zapamiętał ich pid-y. Przypuśćmy teraz że któryś z
wątków potomnych zakończył się (np. skończył pracę, albo dostał SIGKILL).
Czy wątek główny dostanie po ich zakończeniu SIGCHLD albo jakiś inny sygnał?
Oraz drugie pytanie czy waitpid(,,WNOHANG) i sk-a są w stanie stwierdzić po
pid-ach który z nich się zakończył. A może jest na to inny sposób?


Witold Kuzminski - 29 Lis 2004, 15:48

Witam

Mam pewne wątpliwości dotyczące wątków, których man nie rozwiał :( . Więc
mam kilka pytań. Ale na początek opis sytuacji.

Powiedzmy że główny wątek programu stworzył kilka wątków potomnych przy
pomocy pthread_create i zapamiętał ich pid-y.



pthread_t'y ?

Przypuśćmy teraz że któryś z
wątków potomnych zakończył się (np. skończył pracę, albo dostał SIGKILL).



W pthreads nie ma czegos takiego jak potomny, o tyle, ze gdy juz watek
zostal stworzony, to nie da sie powiedziec ktory watek go stworzyl.
Dalej jesli o to nie zadbasz wprost sygnaly sa "handlowane" na poziomie
procesu, i SIGKILL zalatwia caly proces.

Czy wątek główny dostanie po ich zakończeniu SIGCHLD albo jakiś inny sygnał?



Nie. Watki nie maja osobnego pid'a. To co widzisz na linuxie to male
oszustwo; nie zwracaj na to uwagi.

Oraz drugie pytanie czy waitpid(,,WNOHANG) i sk-a są w stanie stwierdzić po
pid-ach który z nich się zakończył. A może jest na to inny sposób?



Waitpid sluzy do czegania na proces i nie ma nic wspolnego z pthreads.
W pthreads jest pthread_join.


Hannibal - 29 Lis 2004, 16:13


| Czy wątek główny dostanie po ich zakończeniu SIGCHLD albo jakiś inny
| sygnał?

Nie. Watki nie maja osobnego pid'a. To co widzisz na linuxie to male
oszustwo; nie zwracaj na to uwagi.



To że oszusto to wiem, tylko wszystkie opisy mówią o nim w drugą stronę, że
watki to takie oszukane procesy potomne :)

| Oraz drugie pytanie czy waitpid(,,WNOHANG) i sk-a są w stanie stwierdzić
| po pid-ach który z nich się zakończył. A może jest na to inny sposób?

Waitpid sluzy do czegania na proces i nie ma nic wspolnego z pthreads.
W pthreads jest pthread_join.



Wiem że jest pthread_join, tylko to cudo się blokuje, a ja mam kila wątków i
nie wiem który się zakończył i czy wogóle. Tak więc jeżeli trafię na wątek
jeszcze żyjący to główny program mi wtedy się zablokuje na amen.

Chodzi mi o to czy istnieje jakiś mechanizm który mi pozwoli stwierdzić czy
jakiś wątek jeszcze żyje czy już nie.



Witold Kuzminski - 29 Lis 2004, 16:28

| Waitpid sluzy do czegania na proces i nie ma nic wspolnego z pthreads.
| W pthreads jest pthread_join.

Wiem że jest pthread_join, tylko to cudo się blokuje, a ja mam kila wątków i
nie wiem który się zakończył i czy wogóle. Tak więc jeżeli trafię na wątek
jeszcze żyjący to główny program mi wtedy się zablokuje na amen.

Chodzi mi o to czy istnieje jakiś mechanizm który mi pozwoli stwierdzić czy
jakiś wątek jeszcze żyje czy już nie.



Nie ma mechanizmu pozwalajacego sprawdzic czy jakis watek jeszcze zyje.
Tego sie nie da zrobic. Serio.
Mozna tylko stwierdzic, ze juz nie zyje.
Jak chcesz zaczac "watkowac" to musisz sie pogodzic z tym, ze to troche
zmiana "filozofii". Po co chcesz wiedziec czy watek zyje? To bez sensu.
Moze opisz co chcesz osiagnac.


Hannibal - 29 Lis 2004, 17:19


Nie ma mechanizmu pozwalajacego sprawdzic czy jakis watek jeszcze zyje.
Tego sie nie da zrobic. Serio.
Mozna tylko stwierdzic, ze juz nie zyje.
Jak chcesz zaczac "watkowac" to musisz sie pogodzic z tym, ze to troche
zmiana "filozofii". Po co chcesz wiedziec czy watek zyje? To bez sensu.
Moze opisz co chcesz osiagnac.



Nie chce wiedzieć czy nieżyje ale...

Powiedzmy że mam tablicę zawierającą pewną ilość pthread_t aktywnych wątków.
Po pewnym czasie któryś z nich zakończył się i w związku z tym program
główny musi podjąć pewne operacje zależne od tego który to był. Tak więc
muszę przeszukać tablicę w poszukiwaniu tego nieaktywnego, tylko problem
polega na tym że są też tam nadal aktywne wątki i jeżeli będę je testował
pthread_join to się to cudo zablokuje i na tym się skończy.

Ogólnie rzecz biorąc, czy istnieje jakiś mechanizm który potrafi wyłuskać
spośród kilku wątków te nieaktywne nie blokując przy tym programu głównego?
Czy też muszę sam taki mechanizm stworzyć, np. w postaci jakiegoś semafora,
czy wartości atomowej ustawianej tuż przed wyjściem?


Witold Kuzminski - 29 Lis 2004, 21:33


| Nie ma mechanizmu pozwalajacego sprawdzic czy jakis watek jeszcze zyje.
| Tego sie nie da zrobic. Serio.
| Mozna tylko stwierdzic, ze juz nie zyje.
| Jak chcesz zaczac "watkowac" to musisz sie pogodzic z tym, ze to troche
| zmiana "filozofii". Po co chcesz wiedziec czy watek zyje? To bez sensu.
| Moze opisz co chcesz osiagnac.

Nie chce wiedzieć czy nieżyje ale...



Nie chcesz wiedziec jeynej rzeczy, ktora mozesz wiedziec...
Coz, tak tez mozna :)
Serio: pisalem juz, ze to odrobine inna filozofia. Tj. oczywiscie nie
ma jedynie slusznych metod, ale sa pewne rzeczy, ktore sie czesto
robi, i takie ktorych sie nie robi.
Np. sprawdzanie czy watek zyje jest pozbawione sensu z definicji,
bo ta informacja jest nieaktualna natychmiast po jej uzyskaniu.
Pomysl nad tym chwile...

Powiedzmy że mam tablicę zawierającą pewną ilość pthread_t aktywnych wątków.
Po pewnym czasie któryś z nich zakończył się i w związku z tym program
główny musi podjąć pewne operacje zależne od tego który to był.



Taaaa. To moze byc bardzo ciekawe. Jaka operacje? Ma wystartowac nowy
watek, ktory robi to samo co tamten, czy nowy watek, ktory robi cos
innego?
Czy moze jeszcze calkiem cos innego?

Tak więc
muszę przeszukać tablicę w poszukiwaniu tego nieaktywnego, tylko problem
polega na tym że są też tam nadal aktywne wątki i jeżeli będę je testował
pthread_join to się to cudo zablokuje i na tym się skończy.



Wlasnie. Sie cudo blokuje. Wyciagniesz sam wnioski?

Ogólnie rzecz biorąc, czy istnieje jakiś mechanizm który potrafi wyłuskać
spośród kilku wątków te nieaktywne nie blokując przy tym programu głównego?



Nie ma czegos takiego jak watki nieaktywne. Tj. pomijam mozliwosc, ze
masz na mysli watki czekajace/zablokowane, a przyjmuje, ze masz na mysli
te watki, ktorych nie ma. Zatem: nie da sie wyluskac z tablicy zawierajacej
pthread_t watkow, ktorych nie ma (tj. nie da z przewidywalna doza sukcesu).

Czy też muszę sam taki mechanizm stworzyć, np. w postaci jakiegoś semafora,
czy wartości atomowej ustawianej tuż przed wyjściem?



Najlepiej przemysl swoj projekt od poczatku.

powie ci, ze przeszukiwanie tablicy watkow w poszukiwaniu tych niekatywnych
zle im pachnie :)


Witold Kuzminski - 29 Lis 2004, 22:27


| Nie ma mechanizmu pozwalajacego sprawdzic czy jakis watek jeszcze zyje.
| Tego sie nie da zrobic. Serio.
| Mozna tylko stwierdzic, ze juz nie zyje.
| Jak chcesz zaczac "watkowac" to musisz sie pogodzic z tym, ze to troche
| zmiana "filozofii". Po co chcesz wiedziec czy watek zyje? To bez sensu.
| Moze opisz co chcesz osiagnac.

| Nie chce wiedzieć czy nieżyje ale...

Nie chcesz wiedziec jeynej rzeczy, ktora mozesz wiedziec...
Coz, tak tez mozna :)
Serio: pisalem juz, ze to odrobine inna filozofia. Tj. oczywiscie nie
ma jedynie slusznych metod, ale sa pewne rzeczy, ktore sie czesto
robi, i takie ktorych sie nie robi.
Np. sprawdzanie czy watek zyje jest pozbawione sensu z definicji,
bo ta informacja jest nieaktualna natychmiast po jej uzyskaniu.
Pomysl nad tym chwile...

| Powiedzmy że mam tablicę zawierającą pewną ilość pthread_t aktywnych wątków.
| Po pewnym czasie któryś z nich zakończył się i w związku z tym program
| główny musi podjąć pewne operacje zależne od tego który to był.

Taaaa. To moze byc bardzo ciekawe. Jaka operacje? Ma wystartowac nowy
watek, ktory robi to samo co tamten, czy nowy watek, ktory robi cos
innego?
Czy moze jeszcze calkiem cos innego?

| Tak więc
| muszę przeszukać tablicę w poszukiwaniu tego nieaktywnego, tylko problem
| polega na tym że są też tam nadal aktywne wątki i jeżeli będę je testował
| pthread_join to się to cudo zablokuje i na tym się skończy.

Wlasnie. Sie cudo blokuje. Wyciagniesz sam wnioski?

| Ogólnie rzecz biorąc, czy istnieje jakiś mechanizm który potrafi wyłuskać
| spośród kilku wątków te nieaktywne nie blokując przy tym programu głównego?

Nie ma czegos takiego jak watki nieaktywne. Tj. pomijam mozliwosc, ze
masz na mysli watki czekajace/zablokowane, a przyjmuje, ze masz na mysli
te watki, ktorych nie ma. Zatem: nie da sie wyluskac z tablicy zawierajacej
pthread_t watkow, ktorych nie ma (tj. nie da z przewidywalna doza sukcesu).

| Czy też muszę sam taki mechanizm stworzyć, np. w postaci jakiegoś semafora,
| czy wartości atomowej ustawianej tuż przed wyjściem?

Najlepiej przemysl swoj projekt od poczatku.

powie ci, ze przeszukiwanie tablicy watkow w poszukiwaniu tych niekatywnych
zle im pachnie :)



Aaaa, bylbym zapomnial: powinienes na poczatek zapomniec o semaforach.
Oczywiscie nie dlatego, ze nie da sie przy uzyciu semafora
poinformowac watkow o tym, ze dany watek nie zyje. Taka proba jest bez
sensu z definicji, a nie z winy semafora.
Na poczatek zajmij sie mutexami i condvarami. Te sie do czegos
autentycznie przydaja.


Hannibal - 30 Lis 2004, 08:13


Aaaa, bylbym zapomnial: powinienes na poczatek zapomniec o semaforach.
Oczywiscie nie dlatego, ze nie da sie przy uzyciu semafora
poinformowac watkow o tym, ze dany watek nie zyje. Taka proba jest bez
sensu z definicji, a nie z winy semafora.
Na poczatek zajmij sie mutexami i condvarami. Te sie do czegos
autentycznie przydaja.



Dzięki za uświadomienie mi niewiedzy. Muteksy oczywiście znam i chyba o nie
oprę test na zakończenie. To jest nawet naturale, tylko że te opisy o niby
procesach mi pomieszały :(.

Witold Kuzminski - 30 Lis 2004, 09:27


Muteksy oczywiście znam i chyba o nie
oprę test na zakończenie.



Mutexy nie sluza do testowania zakonczenia a do zapewnienia
wylacznosci (to bedzie z grubsza).

To jest nawet naturale, tylko że te opisy o niby
procesach mi pomieszały :(.



Fakt, te opisy o niby procesach musza byc deczko mylace (sam ich
nigdy nie widzialem, ale to jedna z "cech" linuxa).
Ciagle mutexy nie sluza do testowania zakonczenia.
Mialem na mysli to, ze jesli mususz wiedziec, ktory konkretnie
watek sie skonczyl, to byc moze plyniesz pod prad.
Nie mysl o watkach i ich czasie zycia, tylko o zadaniu do wykonania.
Czesto dobrze jest zrobic watki "anonimowe", tj. takie, ktorych
identycznosc jest nieistotna. Klasyka watkowania i ostatnio politycznie
poprawny model to tzw "worker pool". Zamiast czekac az watek skonczy
zycie, czekaj az zrobi co ma zrobic i daj mu wiecej, jak juz skonczy.
Do sygnalizowania, ze skonczyl sluza w pthreads condition variables.
To o nich poczytaj.
Oczywiscie latwiej byloby cos podpowiedziec, gdybys opisal "problem".
Na razie wydaje sie, ze masz nie najzgrabniejsze rozwiazanie i
usilujesz za pomoca reanimacji utrzymac je przy zyciu.
Moze jakas ksiazka? Np. Butenhof?


Hannibal - 30 Lis 2004, 10:29


Mutexy nie sluza do testowania zakonczenia a do zapewnienia
wylacznosci (to bedzie z grubsza).



Tyle to wiem, miałem na myśli ochronę zmiennej, sygnalizującej zakończenie
pracy, muteksem.

Czesto dobrze jest zrobic watki "anonimowe", tj. takie, ktorych
identycznosc jest nieistotna.
Klasyka watkowania i ostatnio politycznie
poprawny model to tzw "worker pool". Zamiast czekac az watek skonczy
zycie, czekaj az zrobi co ma zrobic i daj mu wiecej, jak juz skonczy.



To mi wreszcie dało do myślenia, faktycznie nierozróźnialne wątki rozwiążą
wiele problemów.

Do sygnalizowania, ze skonczyl sluza w pthreads condition variables.
To o nich poczytaj.



Poczytałem. W stronę o której mówisz nie będą mi przydatne bo program główny
ma także inną robotę. Ale czekanie na nich uruchomionych ale bezrobotnych
wątków na nową porcję roboty jak najbardziej mi się przyda.


Witold Kuzminski - 30 Lis 2004, 11:13



| Mutexy nie sluza do testowania zakonczenia a do zapewnienia
| wylacznosci (to bedzie z grubsza).

Tyle to wiem, miałem na myśli ochronę zmiennej, sygnalizującej zakończenie
pracy, muteksem.

| Czesto dobrze jest zrobic watki "anonimowe", tj. takie, ktorych
| identycznosc jest nieistotna.
| Klasyka watkowania i ostatnio politycznie
| poprawny model to tzw "worker pool". Zamiast czekac az watek skonczy
| zycie, czekaj az zrobi co ma zrobic i daj mu wiecej, jak juz skonczy.

To mi wreszcie dało do myślenia, faktycznie nierozróźnialne wątki rozwiążą
wiele problemów.

| Do sygnalizowania, ze skonczyl sluza w pthreads condition variables.
| To o nich poczytaj.

Poczytałem. W stronę o której mówisz nie będą mi przydatne bo program główny
ma także inną robotę.



Beda, beda :)
Watek "glowny" prawdopodobnie nie bedzie mogl narobic nieskonczenie
wiele roboty dla watkow-robotnikow. Wtedy tak samo jak watki-robotnicy
czekaja na nowa robote, watek glowny musi czekac, az robotnicy troche
porobia, zanim doda im nowej.


Hannibal - 30 Lis 2004, 11:23


Wtedy tak samo jak watki-robotnicy
czekaja na nowa robote, watek glowny musi czekac, az robotnicy troche
porobia, zanim doda im nowej.



Główny będzie czekał ale na select z socketem :).

Witold Kuzminski - 30 Lis 2004, 13:07



| Wtedy tak samo jak watki-robotnicy
| czekaja na nowa robote, watek glowny musi czekac, az robotnicy troche
| porobia, zanim doda im nowej.

Główny będzie czekał ale na select z socketem :).



A co bedzie gdy nagle tym socketem zacznie przychodzic tyle, ze rzeczy
do obrobienia bedzie przybywac i przybywac?


Hannibal - 30 Lis 2004, 13:50


| Główny będzie czekał ale na select z socketem :).

A co bedzie gdy nagle tym socketem zacznie przychodzic tyle, ze rzeczy
do obrobienia bedzie przybywac i przybywac?



Wątek główny będzie tylko wysyłał info na temat serwera oraz przyjmował
zlecenie na początek sesji klienckiej. Sesje będą całkowicie obsługiwane w
wątkach robotnikach (łącznie z ich własnym selectem i socketem). Oczywiście
ich ilość jest na twardo ograniczona. Gdy przyjdzie coś co nie jest
prawidłowe, wątek ładnie się podziękuje klientowi za współpracę i przejdzie
do tych wolnych, czekających na pthread_cond :). Natomiast wątek głowny
odeśle błąd i nic więcej nie będzie robił z danym połaczeniem i będzie
czekał dalej. Tak samo będzie gdy ilość sesji osiągnie maksimum.

UOP, kryptografia i podobne watki..
CSocket i Wątki
Watki w dll
Watki
  • tanie wizytowe buty
  • zyczenia dla przyszlych matek
  • zyczenia na rocznice diamentowa
  • 18 500 kolno
  • krwawa repozycja
  • koszt grzania c w u gaz
  • szczepanik teksty piosenek
  • slownik szwedzki
  • brendon urie
  • Katalog wypowiedzi z for internetowych ^^ Strona Główna