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
|
|