Dle analytics.usa.gov je za posledních 90 dnů 6,2 % přístupů k webových stránkám a aplikacím federální vlády Spojených států z Linuxu.
Jak si zobrazit pomocí Chrome a na Chromiu založených webových prohlížečích stránky s neplatným certifikátem? Stačí napsat thisisunsafe.
V repozitáři AUR (Arch User Repository) linuxové distribuce Arch Linux byly nalezeny a odstraněny tři balíčky s malwarem. Jedná se o librewolf-fix-bin, firefox-patch-bin a zen-browser-patched-bin.
Dle plánu by Debian 13 s kódovým názvem Trixie měl vyjít v sobotu 9. srpna.
Vývoj linuxové distribuce Clear Linux (Wikipedie) vyvíjené společností Intel a optimalizováné pro jejich procesory byl oficiálně ukončen.
Byl publikován aktuální přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie).
V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Forgejo byla vydána ve verzi 12.0 (Mastodon). Forgejo je fork Gitei.
Nová čísla časopisů od nakladatelství Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 155 (pdf) a Hello World 27 (pdf).
Hyprland, tj. kompozitor pro Wayland zaměřený na dláždění okny a zároveň grafické efekty, byl vydán ve verzi 0.50.0. Podrobný přehled novinek na GitHubu.
Patrick Volkerding oznámil před dvaatřiceti lety vydání Slackware Linuxu 1.00. Slackware Linux byl tenkrát k dispozici na 3,5 palcových disketách. Základní systém byl na 13 disketách. Kdo chtěl grafiku, potřeboval dalších 11 disket. Slackware Linux 1.00 byl postaven na Linuxu .99pl11 Alpha, libc 4.4.1, g++ 2.4.5 a XFree86 1.3.
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: