Spolek OpenAlt zve příznivce otevřených řešení a přístupu na 209. brněnský sraz, který proběhne tento pátek 16. května od 18:00 ve studentském klubu U Kachničky na Fakultě informačních technologií Vysokého učení technického na adrese Božetěchova 2/1. Jelikož se Brno stalo jedním z hlavních míst, kde se vyvíjí open source knihovna OpenSSL, tentokrát se OpenAlt komunita potká s komunitou OpenSSL. V rámci srazu Anton Arapov z OpenSSL
… více »GNOME Foundation má nového výkonného ředitele. Po deseti měsících skončil dočasný výkonný ředitel Richard Littauer. Vedení nadace převzal Steven Deobald.
Byl publikován přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie) za uplynulé dva měsíce. Servo zvládne už i Gmail. Zakázány jsou příspěvky generované pomocí AI.
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.
gcc test.cpp -o test -Wall -pedantic -pthread
a haze mi to chybu:
test.cpp: In function ‘void* PrintHello(void*)’:
test.cpp:8: error: cast from ‘void*’ to ‘int’ loses precision
a zdrojak je tento:
void *PrintHello(void *threadid)
{
int tid=(int)threadid;
printf("Hello World! It's me, thread #%d!\n", tid);
pthread_exit(NULL);
}
int main (int argc, char *argv[])
{
pthread_t threads[5];
int rc, t;
for(t=0; t<5; t++)
{
printf("In main: creating thread %d\n", t);
rc = pthread_create(&threads[t], NULL, PrintHello, (void *)t);
if(rc)
{
printf("ERROR; return code from pthread_create() is %d\n", rc);
return -1;
}
}
pthread_exit(NULL);
}
omlouvam se ze na vas vyrukuji asi s trivialnim dotazem, ale opravdu netusim co s tim.....
int tid=(int)(long)threadid;by mělo jít.
Trochu mi vrtá hlavou, co vede člověka k použití '-pedantic
' při překladu zdrojáku, kde se přetypovává void*
na int
… :-)
Buď to překládejte s méně striktními parametry nebo to předání proveďte čistším způsobem.
int
(64-bitová platforma?), pak tam prostě ke ztrátě informace dochází. Překladač nemůže vědět, že to nevadí, protože to stejně vždycky voláte s pointerem, který sám vznikl přetypováním z int
.
int
u stejná nebo menší než šířka pointeru, ale jinde to tak být nemusí.
Já osobně bych to ale řešil tak, že bych předávat pointer na int (nebo rovnou na nějakou strukturu, pokud bude potřeba více dat). Ale pozor aby ses nespálil (nepřepsal si něco pod rukama dříve, než to to vlákno přečte), taky bys měl dbát na uvolňování paměti.
unsigned long long tid=(unsigned long long)threadid; printf("Hello World! It's me, thread #%llu!\n", tid);i když by se jistě našlo něco lepšího či přenositelnějšího. P.S. A je docela možné, že ten zdroják v c++ budete muset kompilovat třeba g++, ne jen gcc.
Stálo by za to označit, která z řádek programu je řádka 8, na které to tu chybu hlásí
Jinak, potenciální problémy tam vidím tyto:
PrintHello()
nemá stanovenou výchozí hodnotu, přestože je deklarovaná jako vracející void *
; vím, že ve skutečnosti se ta funkce nikdy nevrátí, ale překladač to IMHO neví a může ho to mást. Doplnil bych fiktivní return NULL
. To samé platí pro main()
.PrintHello()
, by měla pouze napsat pozdrav; rozhodně ne vypsat pozdrav a pak ukončit thread! Buď přejmenovat na PrintHelloAndExit
, nebo dát ukončení threadu někam jinam. Kdyby se taková funkce vyskytovala ve skutečné aplikaci, bude to ošklivá nášlapná mina na každého, kdo bude ten program udržovat nebo upravovat.pthread_exit()
jsou v daném kódu úplně zbytečná; hlavní funkce threadu může svůj výstupní ukazatel prostě vrátit (proto je deklarována jako vracející void *
; hlavní funkce programu taktéž.tid
, je matoucí, protože skutečný TID (ten, který se získá voláním funkce gettid()
) je něco úplně jiného. Opět ošklivá nášlapná mina, zvlášť proto, že skutečný TID je také celé číslo.Funkce PrintHello() nemá stanovenou výchozí hodnotu, přestože je deklarovaná jako vracející void *; vím, že ve skutečnosti se ta funkce nikdy nevrátí, ale překladač to IMHO neví a může ho to mást. Doplnil bych fiktivní return NULL. To samé platí pro main().Překladač to ví.
Štábní kultura: funkce, která se jmenuje PrintHello(), by měla pouze napsat pozdrav; rozhodně ne vypsat pozdrav a pak ukončit thread! Buď přejmenovat na PrintHelloAndExit, nebo dát ukončení threadu někam jinam. Kdyby se taková funkce vyskytovala ve skutečné aplikaci, bude to ošklivá nášlapná mina na každého, kdo bude ten program udržovat nebo upravovat.To by pak mělo na konci jména mít AndExit nějakých 90 % funkcí pro vlákna, co se v programech kdy vyskytují
PrintHello
nelze vyčíst, že je to hlavní funkce vlákna. Kdyby se jmenovala, dejme tomu, HelloThreadMain
, bylo by hned jasno.
Kdyby to byla knihovní funkce, která dejme tomu vykreslí nějaké logo, tak se může klidně stát, že ji někdo vyvolá ze singlethreadového programu, a žuch.
A pthread_exit v main() se mi nelíbí ani trochu.Niekedy to volanie môže myť zmysel. Ak tam je, tak sa počká, kým sa všetky vlákna ukončia (a až potom sa ukončí aj hlavné vlákno). Práve v tom príklade to zmysel má, kedže tam nie je žiadne čakanie na to, až urobia tie vytvorené vlákna to, čo urobiť majú.
unsigned long long tid=(unsigned long long)threadid;
printf("Hello World! It's me, thread #%llu!\n", tid
tak:
int tid=(int)(long)threadid;
nutno kompilovat s g++
dekuji vsem kteri prispeli k vyreseni meho problemu, dekuji i tem kteri me poucili o štábní kultuře, v budoucnu az ziskam urcite zkusenosti se ji budu urcite ridit....
Tiskni
Sdílej: