Open source RDP (Remote Desktop Protocol) server xrdp (Wikipedie) byl vydán ve verzi 0.10.0. Z novinek je vypíchnuta podpora GFX (Graphic Pipeline Extension). Nová větev řeší také několik bezpečnostních chyb.
Rocky Linux byl vydán v nové stabilní verzi 9.4. Přehled novinek v poznámkách k vydání.
Dellu byla odcizena databáze zákazníků (jméno, adresa, seznam zakoupených produktů) [Customer Care, Bleeping Computer].
V lednu byl otevřen editor kódů Zed od autorů editoru Atom a Tree-sitter. Tenkrát běžel pouze na macOS. Byl napevno svázán s Metalem. Situace se ale postupně mění. V aktuálním příspěvku Kdy Zed na Linuxu? na blogu Zedu vývojáři popisují aktuální stav. Blíží se alfa verze.
O víkendu 11. a 12. května lze navštívit Maker Faire Prague, festival plný workshopů, interaktivních činností a především nadšených a zvídavých lidí.
Byl vydán Fedora Asahi Remix 40, tj. linuxová distribuce pro Apple Silicon vycházející z Fedora Linuxu 40.
Představena byla služba Raspberry Pi Connect usnadňující vzdálený grafický přístup k vašim Raspberry Pi z webového prohlížeče. Odkudkoli. Zdarma. Zatím v beta verzi. Detaily v dokumentaci.
Byla vydána verze R14.1.2 desktopového prostředí Trinity Desktop Environment (TDE, fork KDE 3.5). Přehled novinek v poznámkách k vydání, podrobnosti v seznamu změn.
Dnešním dnem lze již také v Česku nakupovat na Google Store (telefony a sluchátka Google Pixel).
Apple představil (keynote) iPad Pro s čipem Apple M4, předělaný iPad Air ve dvou velikostech a nový Apple Pencil Pro.
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í A pthread_exit v main() se mi nelíbí ani trochu.
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: