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í
×
    včera 19:44 | IT novinky

    Samsung na akci Galaxy Unpacked July 2026 (YouTube) představil své nové telefony Galaxy Z Fold8 Ultra, Fold8 a Flip8, hodinky Galaxy Watch Ultra2 a Watch9 a chytré brýle ve spolupráci s Gentle Monster a Warby Parker.

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

    Po pěti letech vývoje vyšla česká počítačová hra Scarlet Deer Inn (ProtonDB). Scarlet Deer Inn je vyšívaná temná středověká pohádka. Zatímco život ve zdánlivě obyčejné vesnici se točí kolem běžných povinností a sousedských drbů, v podzemí se skrývají zlověstná tajemství.

    Ladislav Hagara | Komentářů: 2
    včera 13:33 | IT novinky

    Představen byl Raspberry Pi Touch Display 2 s uhlopříčkou 10 palců a rozlišením 1200 × 1920 pixelů. Cena je 80 dolarů.

    Ladislav Hagara | Komentářů: 1
    včera 13:22 | Komunita

    RPCS3 (Wikipedie), tj. open source emulátor Sony PlayStation 3, snížil minimální požadavky. Nově jsou podporovány starší grafické karty ATI Radeon řady HD 2000, 3000 a 4000 z let 2007 až 2009. Na PC běží už 75 % všech her pro PlayStation 3. V budoucnu bude RPCS3 fungovat bez firmwaru z PS3. V RPCS3 byl implementován systémový modul cellSysmodule (𝕏).

    Ladislav Hagara | Komentářů: 2
    včera 11:00 | Zajímavý software

    Vyšel open-source nástroj winetop (MIT) — nativní CLI/TUI pro sledování a ukončování Wine, Proton, Lutris, Heroic a Bottles sezení. Seskupuje procesy podle WINEPREFIX / Steam AppId, umí bezpečně zabít jen hru (včetně Steam reaperu) a nabízí i skriptovatelné příkazy (list, kill, orphans, …). Balíčky jsou mimo jiné na crates.io, Copru (dnf copr enable kovariadam/winetop), PPA ppa:kovariadam/winetop a AUR (winetop-bin).

    kovariadam | Komentářů: 0
    včera 02:44 | IT novinky

    Ve spolupráci společností OpenAI a Work Louder byla představena (𝕏) hardwarová klávesnice Codex Micro pro práci s AI agenty. Cena klávesnice je 230 dolarů.

    Ladislav Hagara | Komentářů: 1
    21.7. 20:00 | Nová verze

    Byl vydán Mozilla Firefox 153.0. Přehled novinek v poznámkách k vydání a poznámkách k vydání pro vývojáře. Řešeny jsou rovněž bezpečnostní chyby. Nový Firefox 153 bude brzy k dispozici také na Flathubu a Snapcraftu.

    Ladislav Hagara | Komentářů: 0
    21.7. 13:44 | Bezpečnostní upozornění Ladislav Hagara | Komentářů: 11
    21.7. 13:11 | Nová verze

    Byla vydána nová verze 5.44 programovacího jazyka Perl (Wikipedie). Do vývoje se zapojilo 71 vývojářů. Změněno bylo přibližně 270 tisíc řádků v 1 300 souborech. Přehled novinek a změn v podrobném seznamu.

    Ladislav Hagara | Komentářů: 0
    21.7. 12:33 | Pozvánky

    Na 23. září 2026 je do bratislavské Nové Cvernovky naplánovaná jednodenní konference #nobullshit.camp pro tech leadery, DevOps a platform inženýry. Mají tu zaznít upřímné příběhy z praxe o tom, co v produkčních systémech reálně fungovalo, co se pokazilo a co si z toho lidé odnesli. Témata pokrývají tři oblasti – DevOps a platformy (Kubernetes, cloud, provoz systémů), firemní kulturu a leadership. Program běží ve dvou formátech: hlavní

    … více »
    alian | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (11%)
     (7%)
     (2%)
     (17%)
     (30%)
     (5%)
     (6%)
     (2%)
     (15%)
     (24%)
    Celkem 2207 hlasů
     Komentářů: 30, poslední 3.4. 20:20
    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.