abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 16:11 | Nová verze

    Bylo oznámeno vydání Fedora Linuxu 40. Přehled novinek ve Fedora Workstation 40 a Fedora KDE 40 na stránkách Fedora Magazinu. Současně byl oznámen notebook Slimbook Fedora 2.

    Ladislav Hagara | Komentářů: 0
    dnes 13:44 | Upozornění

    ČTK (Česká tisková kancelář) upozorňuje (X), že na jejím zpravodajském webu České noviny byly dnes dopoledne neznámým útočníkem umístěny dva smyšlené texty, které nepocházejí z její produkce. Jde o text s titulkem „BIS zabránila pokusu o atentát na nově zvoleného slovenského prezidenta Petra Pelligriniho“ a o údajné mimořádné prohlášení ministra Lipavského k témuž. Tyto dezinformace byly útočníky zveřejněny i s příslušnými notifikacemi v mobilní aplikaci Českých novin. ČTK ve svém zpravodajském servisu žádnou informaci v tomto znění nevydala.

    Ladislav Hagara | Komentářů: 6
    dnes 13:33 | Komunita

    Byla založena nadace Open Home Foundation zastřešující více než 240 projektů, standardů, ovladačů a knihoven (Home Assistant, ESPHome, Zigpy, Piper, Improv Wi-Fi, Wyoming, …) pro otevřenou chytrou domácnost s důrazem na soukromí, možnost výběru a udržitelnost.

    Ladislav Hagara | Komentářů: 0
    dnes 13:00 | Nová verze

    Společnost Meta otevírá svůj operační systém Meta Horizon OS pro headsety pro virtuální a rozšířenou realitu. Vedle Meta Quest se bude používat i v připravovaných headsetech od Asusu a Lenova.

    Ladislav Hagara | Komentářů: 0
    dnes 04:33 | IT novinky

    Společnost Espressif (ESP8266, ESP32, …) získala většinový podíl ve společnosti M5Stack, čímž posiluje ekosystém AIoT.

    Ladislav Hagara | Komentářů: 0
    včera 23:44 | Nová verze

    Byla vydána nová stabilní verze 3.5 svobodného multiplatformního softwaru pro editování a nahrávání zvukových souborů Audacity (Wikipedie). Přehled novinek také na YouTube. Nově lze využívat cloud (audio.com). Ke stažení je oficiální AppImage. Zatím starší verze Audacity lze instalovat také z Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    včera 16:44 | Zajímavý článek

    50 let operačního systému CP/M, článek na webu Computer History Museum věnovaný operačnímu systému CP/M. Gary Kildall z Digital Research jej vytvořil v roce 1974.

    Ladislav Hagara | Komentářů: 0
    včera 16:22 | Pozvánky

    Byl zveřejněn program a spuštěna registrace na letošní konferenci Prague PostgreSQL Developer Day, která se koná 4. a 5. června. Na programu jsou 4 workshopy a 8 přednášek na různá témata o PostgreSQL, od konfigurace a zálohování po využití pro AI a vector search. Stejně jako v předchozích letech se konference koná v prostorách FIT ČVUT v Praze.

    TomasVondra | Komentářů: 0
    včera 03:00 | IT novinky

    Po 48 letech Zilog končí s výrobou 8bitového mikroprocesoru Zilog Z80 (Z84C00 Z80). Mikroprocesor byl uveden na trh v červenci 1976. Poslední objednávky jsou přijímány do 14. června [pdf].

    Ladislav Hagara | Komentářů: 6
    včera 02:00 | IT novinky

    Ještě letos vyjde Kingdom Come: Deliverance II (YouTube), pokračování počítačové hry Kingdom Come: Deliverance (Wikipedie, ProtonDB Gold).

    Ladislav Hagara | Komentářů: 9
    KDE Plasma 6
     (71%)
     (10%)
     (2%)
     (17%)
    Celkem 688 hlasů
     Komentářů: 4, poslední 6.4. 15:51
    Rozcestník

    Dotaz: C++ ukončení vlákna

    2.5.2008 09:55 fastcoretux | skóre: 5 | Brno
    C++ ukončení vlákna
    Přečteno: 2478×
    Zdravíčko! Od včerejška se snažím vyřešit problém s C++ a vlákny, spíš se snažím pochopit jak to udělat aby to fungovalo tak jak potřebuji a sám si s tím nejspíš neporadím tak bych se chtěl obrátit na vás ;) Pokusím se nastínit můj problém a moji představu jak bych potřeboval aby to fungovalo. Mám třídu Execute ve které se provádí určitá posloupnost, když byl v konstruktoru nastaven parametr threading na true provede se fork a v potomku se spustí vlákno pomocí pthread_create(&threadId, NULL, &runInThread, NULL). Funkce runInThread je deklarována v private jako static void * runInThread(void * arg) a definována následovně
    void * Execute::runInThread(void * arg) {
    	while(1) {
    		if(!checking)
    			break;
    		cerr << "Tisknu o zivot" << endl;
    	}
    		
    	return 0;
    }
    
    Problém je v testování proměnné checking což je privátní proměnná typu bool. Překladač zahlásí
    error: invalid use of member ‘Execute::checking’ in static member function
    . Nevím jak do vlákna dostat mechanismus když se během vykonávání kódu ve třídě Execute změní checking na false aby se vyskočilo ze smyčky a ukončilo i vlákno protože nemá smysl testování dále provádět.
    Děkuji moc za odpovědi, je to pro mě obrovská pomoc. Jsem úplná mátoha, z vláken a procesů se mi jaksi zamotala hlava :)

    Odpovědi

    2.5.2008 10:08 BrandIt
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Teprve se učím programovat, takže možná budu mluvit z cesty, ale jak to vidím: vzhledem k tomu, že metoda runInThread je static, tak i proměnná checking musí být static (jinak se k ní statická metoda nedostane). Další možností by asi bylo předávat proměnnou checking jako parametr vlákna (v ukazatelích se ještě moc nevyznám, něco jako pthread_create(&threadId, NULL, &runInThread, &checking)) a v metodě runInThread s ní pracovat přes arg, ale pak asi vzniká nebezpečí, že objekt obsahující checking může zaniknout dřív, než vlákno.
    2.5.2008 10:35 fastcoretux | skóre: 5 | Brno
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Tez uz nejakou dobu trosku programuji, ale koukam, ze jsem porad vpodstate na zacatku :-) Diky moc za odpoved, zni to dobre ... vyzkousim ;-)
    4.5.2008 10:24 Krakonoš | skóre: 17 | Nová Ves v Horách
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Hlavně ti vzniká problém, že když k proměnné budeš přistupovat ze dvou vláken, tak výsledky budou,...ehm,..nedozírné (čti zlé) - budeš muset proměnnou nějakým způsobem uzamykat. Teda tak bych to řešil v C :-)
    5.5.2008 09:17 BrandIt
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    To jsem pochopil, že k proměnné přistupuje z více vláken, ale tu proměnnou vlákno jenom čte, aby zjistilo, jestli má skončit, ne? Potom by zamykání asi nemělo být potřeba?
    5.5.2008 09:25 Jary | skóre: 30 | blog: Jary má blog | Dům
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    To je jedno jestli ji tohle vlákno jenom čte. Aby to čtení mělo smysl, tak do ní musí jiné vlákno zapisovat. Toto použití však není třeba ošetřovat mutexy, nebo něčím podobným, protože nekonzistence čtených dat nám moc nevadí, jelikož nám nemůže způsobit nic horšího, než že cyklus prostě projde ještě jednou. To již ale bylo řečeno v jiné větvi.
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky. GitHub
    clayman avatar 2.5.2008 10:32 clayman | skóre: 13 | Praha 6
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna

    Hmm, a co třeba udělat členskou funkci v Execute? Něco jako metoda void Execute::setChecking(const bool check), která by se volala z rodičovského procesu, by nezabralo?

    clayman avatar 2.5.2008 10:43 clayman | skóre: 13 | Praha 6
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Navíc pokud má checking opravdu zastavit smyčku vlákna, proč to rovnou nedat do podmínky toho while místo toho, aby se to "přes ruku" přerušovalo breakem? :-)
    2.5.2008 11:57 fastcoretux | skóre: 5 | Brno
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Jojo máš pravdu, když spěchám tak patláma, patláma blbosti :-). Jináč to vypadá, že to šlape ;-) Definice vypadá takto :
    void * Execute::runInThread(void * arg) {
    	
    	bool* check = (bool *) arg;
    	while((*check)) {
    		
    		cerr << "Tisknu o zivot" << endl;
    		sleep(1);
    	}
    	cerr << "Jdu si srknout Matecka" << endl;
    	return 0;
    }
    
    A vlákno spouštím takto pthread_create( &threadId, NULL, &runInThread, &checking);
    Nevím jak moc je to košér v rámci správných zásad programování, ale prozatím to funguje :-)
    2.5.2008 11:10 Jary | skóre: 30 | blog: Jary má blog | Dům
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Myslím, že neuteču daleko od tématu, když se zeptám, jak se má správně definovat proměnná checking tak, aby bylo zaručeno, že mi komplikátor nezoptimalizuje přístup k ní tak, že mi vlákno nikdy neskončí? Je volatile to správné řešení?
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky. GitHub
    clayman avatar 2.5.2008 14:17 clayman | skóre: 13 | Praha 6
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Myslím, že jo.
    2.5.2008 18:40 depka | skóre: 20 | blog: eterity
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    na tu promenou checking sahate z obou vlaken naraz? pak je treba pouzit nejakou synchronizaci(mutex)
    Josef Kufner avatar 2.5.2008 18:59 Josef Kufner | skóre: 70
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    V tomto případě to potřeba není.
    Hello world ! Segmentation fault (core dumped)
    2.5.2008 19:36 fastcoretux | skóre: 5 | Brno
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    nene podle mě to není vůbec třeba, protože jenom kontroluji její stav ale nenastavuji ji
    2.5.2008 20:10 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Ale aby to celé mělo smysl, tak ji odněkud jinud nastavovat budeš :-)

    Nevím jak v C++, my v Javě máme u primitivních typů (s výjimkou longu a double) garantované atomické čtení i atomický zápis, takže tam opravdu stačí volatile (s Javovskou sémantikou, samozřejmě, která mimochodem zaručuje atomicitu čtení a zápisu i pro long a double).
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    2.5.2008 20:45 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna

    To je poměrně častý omyl. Mutex samozřejmě potřebujete zamykat nejen v threadu, který zapisuje, ale i v těch, které čtou. Jinak stejně může ke kolizi dojít. Jediná situace, kdy zamykání není potřeba, je v případě, že se proměnná mění pouze ve vlákně, u kterého máte garantováno, že bude v daném okamžiku jediné, které může k proměnné (jakkoli) přistupovat - např. proto, že ostatní v tu chvíli ještě neexistují.

    V tomto případě asi riziko nebude příliš velké, protože se jedná o typ, u něhož čtení i přiřazení obstará jediná instrukce, takže k problémům nejspíš nedojde. Ale stejně je lepší si na takové praktiky moc nezvykat.

    Bluebear avatar 2.5.2008 22:20 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Myslím, že typ int je atomický na všech rozumných platformách. V info stránkách libc se dokonce píše:
       In practice, you can assume that `int' is atomic.  You can also
    assume that pointer types are atomic; that is very convenient.  Both of
    these assumptions are true on all of the machines that the GNU C
    library supports and on all POSIX systems we know of.
    
    U složitějších typů by samozřejmě ten mutex potřeba byl, ale tady bych ho považoval za zbytečnou komplikaci.
    To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
    3.5.2008 13:17 Messa | skóre: 39 | blog: Messa
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Platí atomocita, když ten int není zarovnaný? (Nezačíná na bajtu s adresou dělitelnou 4?)
    3.5.2008 14:17 Martin Tůma | skóre: 39 | blog: RTFM | Praha
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna

    IMHO ano, protože to je záležitost HW. ASM instrukce je stále tatáž a jedotlivé instrukce jsou na všech mě známých platformách nepřerušitelné.

    Každý má právo na můj názor!
    3.5.2008 16:32 Jirka P
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    No, ony neprerusitelne jsou, ale atomicke ani nahodou. Zapis do zarovnaneho intu je atomicky snad skoro vsude (aspon linuxovy zdrojaky se tak tvari), ale zapis do nezarovnaneho treba na intelu jen s lock prefixem. Ostatni instrukce jsou na tom jeste hur.

    Ale hlavne si myslim, ze v tomhle pripade je atomicita zbytecna. On ten bool vzdy bude 0 nebo nenula a (pokud 0 znamena pokracuj!) a v okamziku nastavovani ten thread uvidi nejaky bordel, tak pokud je !=0 tak stejne skonci, pokud je 0 tak se holt zastavi az po dalsi iteraci (kdy bude ten int plne zapsan).
    3.5.2008 17:03 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Doufám, že se nehodláš živit psaním kompilátorů... :-D Dokonce ani na x86 nejsou všechny operace pracující s pamětí defaultně atomické, a co teprv jinde.
    3.5.2008 18:43 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Zajímalo by mne, jak se člověk může dostat k tomu, že se bude živit psaním kompilátorů. Tahle problematika mne (čistě amatérsky) zajímá už od prváku na univerzitě (což je, hm, sedm let?) a pořád mám dojem, že bych se přinejlepším zmohl tak na nějakou akademickou ptákovinu (interpret podmnožiny Lispu jsem psal jako semestrálku ve třeťáku :-) ). A čím dál víc mám dojem, že jde na jednu stranu o brutální diskrétní matematiku, a na druhou stranu o brutální low-level počítačové architektury. Je v silách běžného smrtelníka znát obojí? :-)
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    3.5.2008 19:14 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Tak na tohle se musíš zeptat Honzy Hubičky a Zdeňka Dvořáka. :-) To jsou jediní profesionální autoři kompilátorů, které osobně znám. :-) Totiž vlastně ještě jsem byl na pivu s Andreasem Jaegerem, ale ten je trochu z ruky. Ale s těma požadavkama máš docela pravdu...třeba se do toho tak za deset let zapojím taky. ;-)
    3.5.2008 19:35 Ladicek | skóre: 28 | blog: variace | Havlíčkův brod
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Tenhle Honza Hubička, co o něm Dement píše: Jednou, když kolem prošel HH, mi cpoc povídá: "Ten Hubička je snad na kokainu, že se pořád tak usmívá."? Tak to se s kariérou kompileristy můžu rovnou rozloučit, na to nemám :-)
    Ještě na tom nejsem tak špatně, abych četl Viewegha.
    3.5.2008 19:49 Kyosuke | skóre: 28 | blog: nalady_v_modre
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Potkal jsem ho jednou v práci, tak jsem toho hned využil a vytáhl z něj nějaký věci ohledně profile-guided optimalizací v GCC. ;-) Škoda, že měl naspěch.
    4.5.2008 10:30 Krakonoš | skóre: 17 | Nová Ves v Horách
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Předpokládat můžu cokoliv. Souhlasím, že int atomický být může. Nikde není psáno, že na architektuře UFO-8036*10^50 bude taky. V tom případě bych raději použil nějaký mutex. Konec konců když použiju mutex, můžu místo int nadeklarovat jakejkoliv jinej typ (třeba nějaký objekt) a testovat jej. Není nic lepšího než psát program s tím, že "tady mutex nebude zapotřebí" a potom se divit, když jednou budu mutex potřebovat a budu potřebovat ho přidat do deseti souborů,.. :-)
    4.5.2008 13:01 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Navíc je riziko, že když si člověk empiricky ověří, že mu něco projde, začne to dělat problémy, jakmile se ta aplikace spustí na víceprocesorovém systému. Viz třeba ten nezarovnaný int, o kterém už tu byla řeč.
    Bluebear avatar 2.5.2008 22:22 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    K čemu se tam používá to volání fork()? Opravdu chcete vytvořit nový proces a v něm pak ještě navíc nový thread?
    To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
    2.5.2008 22:37 František Ryšánek
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Jsem samouk, snad mě nikdo nebude tlouct, když přispěju troškou do mlýna :-)

    1) chcípat vlákno přes booleovskou proměnnou bez dalších opatření (synch.primitiv) lze bez problému v případě, že zápis do proměnné je od přírody atomický a dál záleží na kontextu řízeného vlákna, zda mu nevadí, že třeba proběhne svoji smyčku o jednou méně nebo o jednou více. Což typicky nevadí u jednoduchých "hlídacích" smyček apod. Pokud vlákno čeká v nejakém blokujícím syscallu, který je navíc interruptible, tak se dá usmrcení vlákna vylepšit o to, že mu člověk navíc pošle signál - ale tady už bacha na atomicitu a synchronizaci... Pokud připadá v úvahu jak explicitní tak svévolné ukončení vlákna, začne být synchronizace na konci zajímavá :-)

    2) Pokud mám větší počet "dělnických" vláken stejného druhu, obvykle si pro ně vyrobím třídu worker_thr nebo tak nějak. V této třídě mám přesně v duchu původního příspěvku typicky nějakou booleovskou proměnnou typu "zhebni" nebo tak nějak :-) Ne statickou, ale normálního membera. Takže každé vlákno má svoji chcípací proměnnou. Plus jako normální membery mám v této třídě různá synchronizační primitiva (mutexy a podm.proměnné), podle potřeby. A samozřejmě jakákoli další data, která jsou thread-private pro dané dělnické vlákno. Potažmo pointer na instanci téhle třídy se dá poslat vláknu při startu skrz argument void* data v rámci pthread_create(), takže vlákno ví, kde má svůj vlastní soukromý objekt. Když to vezmete o krok dál, proč by vlastně funkce tvořící tělo vlákna nemohla být taky normální member metodou, takže by si svůj objekt nesla implicitně s sebou? Tedy proč ne: proto, že pointer na tuto funkci je třeba předat jako argument pthread_create(), což s normální member metodou nejde. Skrz legacy Cčkový prototyp pthread_create() neprotlačíte vedle pointeru na metodu ještě pointer na její její vlastnický objekt (nemluvě o problémech s late binding)... přesněji řečeno: pointer na metodu neuděláte. Ledaže by ta metoda byla deklarována jako statická. Pointer na statickou metodu udělat lze, a s použitím "plné kvalifikace" ji lze předat jako argument ptherad_create(worker_thr::makej). Jenom do ní musíte pointer na konkrétní objekt předat skrz tradiční void* data. Nakonec to dopadne tak, že skutečné tělo vlákna vymodelujete do podoby normální member metody (která může být i polymorfní), a k ní nadeklarujete ještě doprovodnou statickou metodu, která jí poslouží čistě jako tenký wrapper pro nahození vlákna skrz pthread_create().

    Počítám, že by šlo nějak zapojit šablony nebo aspoň preprocesor, ušetřit si tak datlování a znepřehlednit zdroják :-) Taky si vybavuji, že pro C++ existují hotové "vláknovací knihovny", které se používají košer C++ způsobem... Výše popsané míchání C a sousedních primitivních rysů C++ zavání plebejstvím a polopatismem, které nesluší skutečnému mistru C++ :-) Ale mě osobně tohle míchání Cčka s entry-level C++ vždycky náramně vyhovovalo... třeba kombinace C++ exceptions s posixovými vlákny a signály je vcelku hlavolam, pokud se pamatuji tak bez jednoznačného řešení.
    Bluebear avatar 2.5.2008 23:49 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Pokud vlákno čeká v nejakém blokujícím syscallu, který je navíc interruptible, tak se dá usmrcení vlákna vylepšit o to, že mu člověk navíc pošle signál

    Ha, milovník adrenalinových sportů :-)

    Můžete mě nazvat zbabělcem, ale já bych POSIXové signály a thready nemíchal, dokud by to nebylo nezbytně nutné - každý z těchto fenoménů je dostatečná hrůza sám o sobě. :-(

    Jeden zvlášť děsivý příklad: Před dvěma lety jsem se potkal s programem, kde se podařilo pomocí kombinace volání fork(), clone() a pthread_create() vytvořit dva procesy, ve kterých funkce getpid() vracela stejnou hodnotu (!!). Nahlásil jsem to jako bug do glibc, a co se nestalo? Byl jsem odpálkován - prý to není žádný bug. POSIXová norma říká: po volání fork() může proces volat jenom takové funkce, které jsou "async-signal safe", jinak jsou výsledky nedefinované. A pthread_create() není "async-signal safe", takže se může stát cokoliv a je to úplně v pořádku. Kdyby po tomto volání počítač vyletěl do povětří, pravděpodobně by to bylo pořád OK.

    Od té doby si na takové věci dávám pozor - člověk nikdy neví... :-)
    To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
    3.5.2008 00:16 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Můžete mě nazvat zbabělcem, ale já bych POSIXové signály a thready nemíchal, dokud by to nebylo nezbytně nutné - každý z těchto fenoménů je dostatečná hrůza sám o sobě. :-(

    No jo, ale co s threadem, který sedí v accept() a klidně by tam seděl ještě dva dny, než by se nějaký klient uráčil navázat spojení? Jedině použít pthread_cancel(), ale to taky není úplně bez adrenalinu…

    Bluebear avatar 3.5.2008 00:40 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    No jo, ale co s threadem, který sedí v accept() a klidně by tam seděl ještě dva dny, než by se nějaký klient uráčil navázat spojení? Jedině použít pthread_cancel(), ale to taky není úplně bez adrenalinu...

    To je bohužel pravda. :-( Mě taky nenapadá nic jiného, než to přerušit nějakým signálem. Volání pthread_cancel() se bojím ještě víc než signálů, tam je těch pastiček jak naseto.

    Jediná další možnost, která mě momentálně napadá, je použít neblokující volání accept() a volat ho pěkně ve smyčce s malým čekáním, aby nebylo na první pohled vidět, že je to busyloop. Což je ovšem ještě větší prasárna než všechny dosud zmíněné varianty. :-(
    To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
    Voty avatar 3.5.2008 19:31 Voty | skóre: 12 | blog: gemini
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Nad něčím podobným jsem onehdá přemýšlel a nejbezpečnější mi přišlo si otevřít ještě "synchronizační pipe" a čekat v select(). Mělo ještě výhodu oproti signálům, které se neukládají do fronty.
    Jednu rozbil a tu druhou ztratil.
    3.5.2008 00:20 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    POSIXová norma říká: po volání fork() může proces volat jenom takové funkce, které jsou "async-signal safe", jinak jsou výsledky nedefinované. A pthread_create() není "async-signal safe", takže se může stát cokoliv a je to úplně v pořádku.

    Doufám, že se to týká jen rodiče.

    Kdyby po tomto volání počítač vyletěl do povětří, pravděpodobně by to bylo pořád OK.

    Z hlediska glibc asi ano, ale výrobci hardware by asi odvolání se na POSIX specifikaci jako výmluva nestačilo… :-)

    Bluebear avatar 3.5.2008 00:33 Bluebear | skóre: 30 | blog: Bluebearův samožerblog | Praha
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Doufám, že se to týká jen rodiče.

    Jen potomka. Cituji přesně z toho bugreportu:

    pthread_create is not async-signal-safe. You may call only async-signal-safe functions between fork and exec in a multi-threaded program.

    Otázka je, jak moc to brát vážně, a je také pravda, že od té doby se vývoj posunul o kus dál.

    V dnešních manuálových stránkách je uvedeno, že fork() v multithreadovém programu je sice nebezpečný, ale zvládnutelný; hlavní nebezpečí tkví v tom, že nově vytvořený proces zdědí datové struktury, které popisují thready rodiče, ale sám má na začátku jen jeden jediný thread. Tomu se dá čelit registrací funkce pthread_atfork(), která vzniklý bordel musí nějak poklidit. To znamená, že vývojáři si tento problém uvědomili a pokusili se poskytnout prostředky, jak se z toho dostat.
    To mi připomíná, jak jsem si pořídil květináč, že v něm budu mít květinu. Opravdu tam byla, ale potom být přestala...
    3.5.2008 00:37 Michal Kubeček | skóre: 72 | Luštěnice
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Aha, tak mezi fork() a exec(), to je jiná. Já už se lekl, že bych v potomkovi vzniklém fork() už nikdy nemohl zavolat pthread_create(). To by se ti multithreadoví démoni psali dost špatně…
    3.5.2008 16:45 Jirka P
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Pokud vlákno čeká v nejakém blokujícím syscallu, který je navíc interruptible, tak se dá usmrcení vlákna vylepšit o to, že mu člověk navíc pošle signál

    Ha, milovník adrenalinových sportů
    Nahodou, tady o zadny adrenalin nejde - protoze se (pravdepodobne - aspon ja bych to tak udelal) vubec nepouzije signal handler.
    2.5.2008 23:55 Jary | skóre: 30 | blog: Jary má blog | Dům
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Moc jsem z toho tvého povídání v 2) nepochopil, ale to bude tím, že mi to prostě hlava tak rychle nebere. Chci jen říct, že když jsem dělal asi podobné vylomeniny jako ty, tak jsem thread-function deklaroval jako friend-metodu objektu. Myslím.
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky. GitHub
    3.5.2008 10:15 fastcoretux | skóre: 5 | Brno
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Mě už to hlava snad vůbec nebere ... musel jsem to přes noc už na chvíli nechat jinak by mi možná ruplo v šišce :-) Tak nějak to frčí, ale ne na 100%. Nejsem vůbec odborník na procesy a už vůbec ne na vlákna, takže doufám, že moje komentáře nejsou moc z cesty.
    Zkusím nastínit kompletní problém o co se snažím, píši cgi aplikaci. Když URL obsahuje parametry status=true a name=process1 tak se nejprve provede dynamické načtení třídy process1.so dále pokud je status=true tak se provede fork. V potomku se vytvoří vlákno, ve kterém se testuje(zmíněná proměnná checking, což je proměnná té dynamicky načtené třídy) a spustí se metoda execute() třídy process1, ta obsahuje většinou spouštění dalších externích příkázů ze shellu.Rodič má za úkol provést okamžitý tisk HTML odpovědi do prohlížeče, která obsahuje odkaz na HTML soubor, který obsahuje aktuální stav provádění a je aktualizován právě smyčkou ve vláknu.
    Problém je, že sice vytvořím nový proces ale když dám ve zmíněné metodě sleep(20) tak rodič neprovede tisk HTML odpovědi dřívě než za hodnotu, která je nastavena v sleep, tudíž, že potomek jako by neběžel samostatně. Jinak moc děkuji, za vaše odpovědi a omlouvám se, jestli plácám blbosti a jsem úplně mimo, vím že není dobré to takhle plácat, čas je v tomto případě opravdu neůprosný :-)
    3.5.2008 11:00 Jary | skóre: 30 | blog: Jary má blog | Dům
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Smrdí mi to tím, že používáš sleep z unistd.h a ne z pthread.h. Tímpádem sleep uspává celý proces a probouzí ho signálem. Ty ale chceš uspat jen vlákno.

    Jen nevím, jak to, že ti to neřve něco o tom, že je metoda s identifikátorem sleep je definovaná dvakrát.
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky. GitHub
    3.5.2008 11:20 fastcoretux | skóre: 5 | Brno
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    asi jsem to nepopsal jasně ... sleep(20) dávám v metodě execute() té dynamické třídy abych si ověřil, že zatímco se vykonává (v tomto případě spinká), rodič něco dělá a nespinká taky :-). Opravdu chci aby se uspal proces, ale vlákno samozřejmě pracovalo dál a testovalo stav procesu skrz checking.
    3.5.2008 12:01 Jary | skóre: 30 | blog: Jary má blog | Dům
    Rozbalit Rozbalit vše Re: C++ ukončení vlákna
    Jsi si jistý, že execute() volá potomek? Bez kódu ti já asi neporadím. A BTW asi by bylo vhodné používat místo "spustí-se" "něco spustí něco".
    .sig virus 3.2_cz: Prosím, okopírujte tento text do vaší patičky. GitHub

    Založit nové vláknoNahoru

    Tiskni Sdílej: Linkuj Jaggni to Vybrali.sme.sk Google Del.icio.us Facebook

    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.