Programovací jazyk HTML.
Podpora TORu v Debianu 11 Bullseye a 10 Buster byla ukončena. Doporučuje se přechod na Debian 12 Bookworm.
Příkaz "opakuj donekonečna" je nově v rozporu s podmínkami používání ChatGPT. Příkaz vedl k prozrazení trénovacích dat [/.].
GNU Project Debugger aneb GDB byl vydán ve verzi 14.1. Podrobný přehled novinek v souboru NEWS. Vypíchnout lze podporu NO_COLOR a Debugger Adapter Protocol (DAP).
Byla vydána verze 5.0 webového aplikačního frameworku napsaného v Pythonu Django (Wikipedie). Přehled novinek v poznámkách k vydání.
TuxClocker je Qt GUI nástroj pro monitorování a nastavování (přetaktovávání) hardwaru na Linuxu. Aktuální verze je 1.4.0. Z novinek lze vypíchnout monitorování využití AMD a NVIDIA VRAM nebo sledování spotřeby energie procesorů AMD a Intel.
O víkendu (15:00 až 23:00) probíhá EmacsConf 2023, tj. online konference vývojářů a uživatelů editoru GNU Emacs. Sledovat ji lze na stránkách konference. Záznamy jsou k dispozici přímo z programu.
Na čem aktuálně pracují vývojáři GNOME a KDE? Pravidelný přehled novinek i s náhledy aplikací v Týden v GNOME a Týden v KDE.
Organizace Apache Software Foundation (ASF) vydala verzi 20 integrovaného vývojového prostředí a vývojové platformy napsané v Javě NetBeans (Wikipedie). Přehled novinek na GitHubu. Instalovat lze také ze Snapcraftu a Flathubu.
Desktopové prostředí Cinnamon, vyvíjené primárně pro distribuci Linux Mint, dospělo do verze 6.0. Seznam změn obsahuje především menší opravy a v říjnovém přehledu novinek v Mintu avizovanou experimentální podporu Waylandu.
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.
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.
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?
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 break
em? 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);
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í?
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.
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.
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é.
int
, o kterém už tu byla řeč.
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…
POSIXová norma říká: po volánífork()
může proces volat jenom takové funkce, které jsou "async-signal safe", jinak jsou výsledky nedefinované. Apthread_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… :-)
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ě…
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.
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.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ý 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.
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 checking
.
Tiskni
Sdílej: