Raspberry Pi Connect, tj. oficiální služba Raspberry Pi pro vzdálený přístup k jednodeskovým počítačům Raspberry Pi z webového prohlížeče, byla vydána v nové verzi 2.5. Nejedná se už o beta verzi.
Google zveřejnil seznam 1272 projektů (vývojářů) od 185 organizací přijatých do letošního, již jednadvacátého, Google Summer of Code. Plánovaným vylepšením v grafických a multimediálních aplikacích se věnuje článek na Libre Arts.
Byla vydána (𝕏) dubnová aktualizace aneb nová verze 1.100 editoru zdrojových kódů Visual Studio Code (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Ve verzi 1.100 vyjde také VSCodium, tj. komunitní sestavení Visual Studia Code bez telemetrie a licenčních podmínek Microsoftu.
Open source platforma Home Assistant (Demo, GitHub, Wikipedie) pro monitorování a řízení inteligentní domácnosti byla vydána v nové verzi 2025.5.
OpenSearch (Wikipedie) byl vydán ve verzi 3.0. Podrobnosti v poznámkách k vydání. Jedná se o fork projektů Elasticsearch a Kibana.
PyXL je koncept procesora, ktorý dokáže priamo spúštat Python kód bez nutnosti prekladu ci Micropythonu. Podľa testov autora je pri 100 MHz približne 30x rýchlejší pri riadeni GPIO nez Micropython na Pyboard taktovanej na 168 MHz.
Grafana (Wikipedie), tj. open source nástroj pro vizualizaci různých metrik a s ní související dotazování, upozorňování a lepší porozumění, byla vydána ve verzi 12.0. Přehled novinek v aktualizované dokumentaci.
Raspberry Pi OS, oficiální operační systém pro Raspberry Pi, byl vydán v nové verzi 2025-05-06. Přehled novinek v příspěvku na blogu Raspberry Pi a poznámkách k vydání. Pravděpodobně se jedná o poslední verzi postavenou na Debianu 12 Bookworm. Následující verze by již měla být postavena na Debianu 13 Trixie.
Richard Stallman dnes v Liberci přednáší o svobodném softwaru a svobodě v digitální společnosti. Od 16:30 v aule budovy G na Technické univerzitě v Liberci. V anglickém jazyce s automaticky generovanými českými titulky. Vstup je zdarma i pro širokou veřejnost.
sudo-rs, tj. sudo a su přepsáné do programovacího jazyka Rust, nahradí v Ubuntu 25.10 klasické sudo. V plánu je také přechod od klasických coreutils k uutils coreutils napsaných v Rustu.
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: