abclinuxu.cz AbcLinuxu.cz itbiz.cz ITBiz.cz HDmag.cz HDmag.cz abcprace.cz AbcPráce.cz
AbcLinuxu hledá autory!
Inzerujte na AbcPráce.cz od 950 Kč
Rozšířené hledání
×
    dnes 01:55 | Nová verze

    Jonathan Thomas oznámil vydání nové verze 3.5.0 video editoru OpenShot (Wikipedie). Zdrojové kódy OpenShotu jsou k dispozici na GitHubu. Ke stažení je i balíček ve formátu AppImage. Stačí jej stáhnout, nastavit právo na spouštění a spustit.

    Ladislav Hagara | Komentářů: 0
    dnes 00:55 | Nová verze

    Byla vydána (𝕏, Bluesky) nová verze 2026.1 linuxové distribuce navržené pro digitální forenzní analýzu a penetrační testování Kali Linux (Wikipedie). Přehled novinek se seznamem 8 nových nástrojů v oficiálním oznámení na blogu.

    Ladislav Hagara | Komentářů: 0
    včera 16:33 | IT novinky

    Vláda jmenovala novým zmocněncem pro digitalizaci a strategickou bezpečnost prvního náměstka ministra vnitra Lukáše Klučku. Ten ve funkci nahradil poslance Roberta Králíčka poté, co Králíček na tento post vládního zmocněnce rezignoval. Klučka chce do roka digitalizovat všechny státní služby tak, aby vyhověly zákonu o právu na digitální služby, přičemž dosavadní plán Fialovy vlády počítal s dokončením digitalizace až někdy v roce

    … více »
    NUKE GAZA! 🎆 | Komentářů: 9
    včera 13:55 | Nová verze

    Byl vydán Mozilla Firefox 149.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Vypíchnout lze bezplatnou vestavěnou VPN s 50 GB přenesených dat měsíčně, zobrazení dvou webových stránek vedle sebe v jednom panelu (split view) nebo možnost přidat poznámky k panelům (Firefox Labs). Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 149 bude brzy k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 4
    včera 13:22 | Nová verze

    Byly vydány nové verze 5.3.0 a 6.0.0 svobodného multiplatformního programu pro skicování, malování a úpravu obrázků Krita (Wikipedie). Přehled novinek i s náhledy a videi v poznámkách k vydání. Obě verze vycházejí ze stejného zdrojového kódu – rozdíl je v použitých verzích Qt a KDE Frameworks. Krita 6.0.0 je první vydání postavené na Qt 6 a stále je považovaná za experimentální. Má lepší podporu Waylandu. Přináší podporu protokolu Wayland

    … více »
    Ladislav Hagara | Komentářů: 1
    včera 04:22 | Nová verze

    Byla vydána nová verze 10.2 z Debianu vycházející linuxové distribuce DietPi pro (nejenom) jednodeskové počítače. Přehled novinek v poznámkách k vydání. Vypíchnout lze nové balíčky Immich, Immich Machine Learning, uv a RustDesk Client.

    Ladislav Hagara | Komentářů: 0
    23.3. 22:11 | Nová verze

    TypeScript (Wikipedie), tj. JavaScript rozšířený o statické typování a další atributy, byl vydán v nové verzi 6.0. Příští verze 7.0 je kvůli výkonu přepisována do programovacího jazyka Go.

    Ladislav Hagara | Komentářů: 0
    23.3. 20:33 | Zajímavý článek

    Christian Schaller z Red Hatu na svém blogu popsal své zkušenosti s používáním AI při vývoji open source aplikací pro Linux. Pomocí různých AI aktualizoval nebo vytvořil aplikace Elgato Light GNOME Shell extension, Dell Ultrasharp Webcam 4K, Red Hat Planet, WMDock, XMMS resuscitated (aktualizace z GTK 2 a Esound na GTK 4, GStreamer a PipeWire) a Monkey Bubble. SANE ovladač pro skener Plustek OpticFilm 8200i se mu zatím nepovedl.

    Ladislav Hagara | Komentářů: 6
    23.3. 19:44 | IT novinky

    Americké firmy Tesla a SpaceX postaví v texaském Austinu moderní komplex na výrobu čipů pro umělou inteligenci (AI). Součástí projektu s názvem Terafab budou dvě moderní továrny na výrobu čipů – jedna se zaměří na automobily a humanoidní roboty, druhá na datová centra ve vesmíru. Uvedl to generální ředitel těchto firem Elon Musk. Projekt by podle odhadů měl stát 20 miliard USD (zhruba 425 miliard Kč).

    Ladislav Hagara | Komentářů: 16
    23.3. 15:00 | Nová verze

    Byla vydána nová stabilní verze 6.11 (YouTube) multiplatformního frameworku a GUI toolkitu Qt. Podrobný přehled novinek v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (15%)
     (7%)
     (1%)
     (12%)
     (29%)
     (2%)
     (5%)
     (1%)
     (13%)
     (24%)
    Celkem 1146 hlasů
     Komentářů: 27, poslední 17.3. 19:26
    Rozcestník

    Administrace komentářů

    Jste na stránce určené pro řešení chyb a problémů týkajících se diskusí a komentářů. Můžete zde našim administrátorům reportovat špatně zařazenou či duplicitní diskusi, vulgární či osočující příspěvek a podobně. Děkujeme vám za vaši pomoc, více očí více vidí, společně můžeme udržet vysokou kvalitu AbcLinuxu.cz.

    Příspěvek
    19.6.2009 00:45 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Tak tohle je průšvih.

    Děkuji všem za komentáře a zejména za odkazy na zajímavé články. Nicméně právě teď jsem udělal praktický pokus s ošklivými spinlocky. Výsledek mě vyděsil. Posuďte sami. Většina toho, co tu zatím bylo řečeno, zcela zjevně není pravda.

    Tady je zdrojový kód:

    #include <unistd.h>
    #include <limits.h>
    #include <stdio.h>
    #include <pthread.h>
    #include <time.h>
    
    static const struct timespec snooze = { 5, 0 };
    
    static int useless;
    static int flag = 1;
    static volatile int FLAG = 1;
    
    static void foo( void ) {}
    static void FOO( int * something ) { useless = *something; }
    
    static void * t1( void * param ) { while ( flag ); puts( "T1 finished." ); return NULL; }
    static void * t2( void * param ) { while ( flag ) foo(); puts( "T2 finished." ); return NULL; }
    static void * t3( void * param ) { while ( flag ) FOO( &flag ); puts( "T3 finished." ); return NULL; }
    static void * t4( void * param ) { while ( FLAG ); puts( "T4 finished." ); return NULL; }
    static void * t5( void * param ) { while ( FLAG ) foo(); puts( "T5 finished." ); return NULL; }
    
    void * ( * const func[ 5 ] )( void * ) = { t1, t2, t3, t4, t5 };
    
    int main( void ) {
            int i;
            pthread_attr_t attr;
            pthread_t threads[ 5 ];
    
            pthread_attr_init( &attr );
            pthread_attr_setstacksize( &attr, PTHREAD_STACK_MIN );
    
            puts( "Spawning threads." );
            for ( i = 0; i < 5; ++i ) pthread_create( &threads[ i ], &attr, func[ i ], NULL );
            nanosleep( &snooze, NULL );
    
            puts( "Setting the death flag." );
            FLAG = flag = 0;
            nanosleep( &snooze, NULL );
    
            puts( "That's the end." );
            return 0;
    }
    

    Ano, je to moc ošklivý kód. Ano, nevolám nikde pthread_join(). (To jsou reakce na předpokládané FAQ.) A tady jsou výsledky, ze kterých mrazí v zádech.

    [andrej@argos pokusy]$ gcc -O0 -pthread spin.c -o spin
    [andrej@argos pokusy]$ ./spin
    Spawning threads.
    Setting the death flag.
    T4 finished.
    T2 finished.
    T1 finished.
    T5 finished.
    T3 finished.
    That's the end.

    Tak tady je vše podle předpokladů. Při -O0 se proměnná čte vždy znovu z paměti.

    [andrej@argos pokusy]$ gcc -O1 -pthread spin.c -o spin
    [andrej@argos pokusy]$ ./spin
    Spawning threads.
    Setting the death flag.
    T5 finished.
    T4 finished.
    That's the end.
    

    Tady se čtou pouze volatile proměnné. Druhé a třetí vlákno proměnnou flag nepřečtou znovu, přestože se pointer na ni předává ven a přestože se v cyklu volá funkce! Při -O2 a -O3 se to chová stejně. Co když teď zdrojový kód trochu pozněníme...?

    --- spin.c      2009-06-18 23:46:52.000000000 +0200
    +++ spin2.c     2009-06-18 23:51:55.000000000 +0200
    @@ -11,7 +11,7 @@
     static volatile int FLAG = 1;
    
     static void foo( void ) {}
    -static void FOO( int * something ) { useless = *something; }
    +static void FOO( int * something ) { ++( *something ); }
    
     static void * t1( void * param ) { while ( flag ); puts( "T1 finished." ); return NULL; }
     static void * t2( void * param ) { while ( flag ) foo(); puts( "T2 finished." ); return NULL; }

    Teď jde opravdu do tuhého a nastává zmatek, jaký jsem ještě neviděl.

    [andrej@argos pokusy]$ gcc -O0 -pthread spin2.c -o spin
    [andrej@argos pokusy]$ ./spin
    Spawning threads.
    Setting the death flag.
    T4 finished.
    T5 finished.
    T2 finished.
    T1 finished.
    That's the end.

    Naprosto špatně. Vlákno T3 by mělo skončit první, ale neskončí vůbec. Proměnnou v cyklu nečte i přesto, že je vypnutá optimalizace a že ji předává jiné funkci, která ji pozmění! Dobře, zkusme optimalizaci zapnout.

    [andrej@argos pokusy]$ gcc -O1 -pthread spin2.c -o spin
    [andrej@argos pokusy]$ ./spin
    Spawning threads.
    T3 finished.
    Setting the death flag.
    T4 finished.
    T5 finished.
    That's the end.

    Ano, takhle to má podle předpokladů (ne)fungovat... O stupeň vyšší optimalizace se chová stejně. Ale u -O3 číhá ošklivé překvapení:

    [andrej@argos pokusy]$ gcc -O3 -pthread spin2.c -o spin
    [andrej@argos pokusy]$ ./spin
    Spawning threads.
    T3 finished.
    T1 finished.
    Setting the death flag.
    T4 finished.
    T5 finished.
    That's the end.

    Tohle už je opravdu těžko vysvětlitelné. Teď znovu vyzkouším první zdrojový kód, jen s jiným kompilátorem:

    [andrej@argos pokusy]$ icc -O0 -pthread spin.c -o spin
    [andrej@argos pokusy]$ ./spin
    Spawning threads.
    Setting the death flag.
    T4 finished.
    T5 finished.
    T3 finished.
    T2 finished.
    T1 finished.
    That's the end.

    Tady žádné překvapení nečíhá.

    [andrej@argos pokusy]$ icc -O1 -pthread spin.c -o spin
    [andrej@argos pokusy]$ ./spin
    Spawning threads.
    T1 finished.
    T2 finished.
    T3 finished.
    Setting the death flag.
    T5 finished.
    T4 finished.
    That's the end.

    Ale toto je prosím pěkně neuvěřitelné. Kompilátor přesunul přiřazení globální proměnné přes několik volání funkcí! Netvrdil tu někdo před chvílí, že to není možné? Jedině volatile proměnná byla přiřazena (a přečtena) ve správnou dobu. Vyšší stupně optimalizace se chovají stejně.

    Nyní znovu vyzkouším pozměněný zdroják s kompilátorem Intel.

    [andrej@argos pokusy]$ icc -O0 -pthread spin2.c -o spin
    [andrej@argos pokusy]$ ./spin
    Spawning threads.
    Setting the death flag.
    T2 finished.
    T1 finished.
    T4 finished.
    T5 finished.
    T3 finished.
    That's the end.

    Toto je další odlišnost od GCC. Tentokrát skončila všechna vlákna. Nicméně vyšší úrovně optimalizace přinesou další překvapení:

    [andrej@argos pokusy]$ icc -O1 -pthread spin2.c -o spin
    [andrej@argos pokusy]$ ./spin
    Spawning threads.
    T2 finished.
    T1 finished.
    Setting the death flag.
    T5 finished.
    T4 finished.
    That's the end.

    Další podivný výsledek. Jedno z vláken neskončilo a tento stav se nepodobá žádnému z předchozích.

    [andrej@argos pokusy]$ icc -O2 -pthread spin2.c -o spin
    [andrej@argos pokusy]$ ./spin
    Spawning threads.
    T1 finished.
    T2 finished.
    T3 finished.
    Setting the death flag.
    T4 finished.
    T5 finished.
    That's the end.

    A zvýšení stupně optimalizace to zase dá do pořádku, přestože jde o jiný kompilátor a jiný stupeň optimalizace. Třetí stupeň se chová stejně.

    Jaké je ponaučení z tohoto pokusu?

    1. Kompilátor umí optimalizovat přístupy do paměti přes volání jakýchkoliv (i knihovních!) funkcí.
    2. Přes volání statických funkcí optimalizuje kompilátor skoro vždy a nelze tomu zabránít.

    3. Schopnost gcc zjistit, zda je volané funkci předáván pointer na danou proměnnou a zda ji tato volaná funkce může nebo nemůže změnit, zjevně závisí na zvolené úrovni optimalizace. (!!!) Výsledky z GCC po aplikaci patche to jasně ukazují. Tohle se vůbec netýká vláken a mohl by to být bug v kompilátoru.

    A jeden fakt na závěr: Vlákna čtoucí volatile proměnnou neselhala ani jednou. Ostatní selhala téměř vždy, přestože podle většiny odpovědí v této diskusi by selhat neměla!

    Jestliže kompilátor dokáže přesouvat přiřazení globální proměnné přes několik systémových volání, přes vytváření vláken a dokonce i přes nanosleep(), jak má potom člověk věřit, že je nebude přesouvat přes synchronizační primitiva?

    Když může přiřazení do globální proměnné přeskočit nanosleep(), proč by nemohlo přeskočit pthread_cond_wait() nebo pthread_cond_signal()? Jak je možné, že vůbec nějaká synchronizace funguje? Možná mi budete spílat, ale pro mě je závěr z tohoto pokusu jednoznačný: volatile vždy a všude!

    Tak teď jsem z toho jelen.

    V tomto formuláři můžete formulovat svou stížnost ohledně příspěvku. Nejprve vyberte typ akce, kterou navrhujete provést s diskusí či příspěvkem. Potom do textového pole napište důvody, proč by měli admini provést vaši žádost, problém nemusí být patrný na první pohled. Odkaz na příspěvek bude přidán automaticky.

    Vaše jméno
    Váš email
    Typ požadavku
    Slovní popis
    ISSN 1214-1267   www.czech-server.cz
    © 1999-2015 Nitemedia s. r. o. Všechna práva vyhrazena.