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 04:44 | Komunita

    Bylo oznámeno, že webový prohlížeč Opera GX zaměřený na hráče počítačových her je už také na Flathubu and Snapcraftu.

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

    Akcionáři americké mediální společnosti Warner Bros. Discovery dnes schválili převzetí firmy konkurentem Paramount Skydance za zhruba 110 miliard dolarů (téměř 2,3 bilionu Kč). Firmy se na spojení dohodly v únoru. O část společnosti Warner Bros. Discovery dříve usilovala rovněž streamovací platforma Netflix, se svou nabídkou však neuspěla. Transakci ještě budou schvalovat regulační orgány, a to nejen ve Spojených státech, ale také

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

    Canonical vydal (email, blog, YouTube) Ubuntu 26.04 LTS Resolute Raccoon. Přehled novinek v poznámkách k vydání. Vydány byly také oficiální deriváty Edubuntu, Kubuntu, Lubuntu, Ubuntu Budgie, Ubuntu Cinnamon, Ubuntu Kylin, Ubuntu Studio, Ubuntu Unity a Xubuntu. Jedná se o 11. vydání s dlouhodobou podporou (LTS).

    Ladislav Hagara | Komentářů: 0
    včera 11:55 | Nová verze

    V programovacím jazyce Go naprogramovaná webová aplikace pro spolupráci na zdrojových kódech pomocí gitu Gitea (Wikipedie) byla vydána v nové verzi 1.26.0. Přehled novinek v příspěvku na blogu.

    Ladislav Hagara | Komentářů: 0
    včera 04:44 | Pozvánky

    Ve středu 29. dubna 2026 se v pražské kanceláři SUSE v Karlíně uskuteční 7. Mobile Linux Hackday, komunitní setkání zaměřené na Linux na mobilních zařízeních, kernelový vývoj i uživatelský prostor. Akce proběhne od 10:00 do večerních hodin. Hackday je určen všem zájemcům o praktickou práci s Linuxem na telefonech. Zaměří se na vývoj aplikací v userspace, například bankovní aplikace, zpracování obrazu z kamery nebo práci s NFC, i na úpravy

    … více »
    lkocman | Komentářů: 1
    22.4. 21:55 | Nová verze

    LilyPond (Wikipedie) , tj. multiplatformní svobodný software určený pro sazbu notových zápisů, byl vydán ve verzi 2.26.0. Přehled novinek v aktualizované dokumentaci.

    Ladislav Hagara | Komentářů: 0
    22.4. 20:33 | Nová verze

    Byla vydána nová verze 11.0.0 otevřeného emulátoru procesorů a virtualizačního nástroje QEMU (Wikipedie). Přispělo 237 vývojářů. Provedeno bylo více než 2 500 commitů. Přehled úprav a nových vlastností v seznamu změn.

    Ladislav Hagara | Komentářů: 0
    22.4. 13:33 | IT novinky

    Společnost SpaceX amerického miliardáře Elona Muska oznámila, že si zajistila opci buď na akvizici startupu Cursor za 60 miliard dolarů (přes 1,2 bilionu Kč) do konce letošního roku, nebo na zaplacení deseti miliard dolarů za nové partnerství s touto firmou zabývající se generováním kódů. SpaceX se dále prosazuje na lukrativním trhu s vývojářskými nástroji pro umělou inteligenci (AI). Cursor, startup zabývající se prodejem modelů AI pro

    … více »
    Ladislav Hagara | Komentářů: 2
    22.4. 13:11 | Komunita

    Díky AI modelu Claude Mythos Preview od společnost Anthropic bylo ve Firefoxu nalezeno a opraveno 271 zranitelností.

    Ladislav Hagara | Komentářů: 6
    22.4. 04:44 | Nová verze

    Byla vydána nová verze 2.54.0 distribuovaného systému správy verzí Git. Přispělo 137 vývojářů, z toho 66 nových. Přehled novinek v příspěvku na blogu GitHubu a v poznámkách k vydání.

    Ladislav Hagara | Komentářů: 0
    Které desktopové prostředí na Linuxu používáte?
     (14%)
     (8%)
     (2%)
     (13%)
     (30%)
     (3%)
     (6%)
     (2%)
     (15%)
     (25%)
    Celkem 1399 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.