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:55 | IT novinky

    Společnost Meta ve spolupráci se společností Oakley oznámila řadu chytrých brýlí Oakley. První Oakley Meta HSTN si lze předobjednat za 499 dolarů.

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

    Ministerstvo průmyslu a obchodu (MPO) vyjádřilo podporu předložení projektu AI Gigafactory CZ, který do veřejné konzultace Evropské komise zaslala společnost České Radiokomunikace (CRA) v rámci iniciativy Project AIGF CZ. Jde o významný krok k rozvoji výpočetní infrastruktury pro umělou inteligenci (AI), která je prioritou resortu. Projekt je v souladu s cíli Národní strategie umělé inteligence ČR 2030 a je již součástí návrhu

    … více »
    Ladislav Hagara | Komentářů: 7
    včera 13:11 | Zajímavý článek

    Nové číslo časopisu Raspberry Pi zdarma ke čtení: Raspberry Pi Official Magazine 154 (pdf). S podtitulem Automatizace domácnosti.

    Ladislav Hagara | Komentářů: 0
    včera 12:22 | IT novinky

    Americký prezident Donald Trump podepsal exekutivní příkaz, který prodlužuje lhůtu pro prodej amerických aktiv aplikace TikTok vlastněné čínskou společností ByteDance do amerických rukou o dalších 90 dnů. Americký Kongres loni v dubnu kvůli bezpečnostním obavám přijal zákon, podle kterého měl vstoupit v platnost zákaz sítě TikTok v USA v případě, že se prodej neuskuteční do 19. ledna. Trump však v lednu lhůtu pro prodej prodloužil o 75 dnů. V dubnu pak přikročil k prodloužení o dalších 75 dnů, lhůta tak měla vypršet dnešním dnem.

    Ladislav Hagara | Komentářů: 1
    včera 12:11 | IT novinky

    Microsoft hodlá zrušit další tisíce pracovních míst, a to především v obchodních odděleních. Předchozí kolo propouštění se uskutečnilo v květnu a dotklo se 6000 zaměstnanců. Vedení firmy již dříve upozornilo, že vzhledem k rozsáhlým investicím do umělé inteligence (AI) se bude snažit omezovat výdaje v jiných oblastech.

    Ladislav Hagara | Komentářů: 5
    19.6. 18:44 | IT novinky

    Společnost Murena ve spolupráci se společností Qwant představila vyhledávač Murena Find. Ve výchozím nastavení bude používán v mobilním operačním systému /e/OS a v Murena Workspace.

    Ladislav Hagara | Komentářů: 0
    19.6. 13:00 | IT novinky

    V mobilní aplikaci Facebooku se lze nově přihlašovat pomocí Passkeys.

    Ladislav Hagara | Komentářů: 3
    19.6. 12:44 | IT novinky

    Společnost Midjourney představila vlastní generátor videí pomocí umělé inteligence (AI) V1 Video Model.

    Ladislav Hagara | Komentářů: 0
    18.6. 23:22 | Nová verze

    Editor kódu Zed (Wikipedie) má nově v sobě integrovaný debugger. Podporuje Rust, C/C++, JavaScript, Go, Python a pomocí rozšíření i další programovací jazyky.

    Ladislav Hagara | Komentářů: 7
    18.6. 22:22 | Zajímavý článek

    Byl publikován aktuální přehled vývoje renderovacího jádra webového prohlížeče Servo (Wikipedie). Servo mimo jiné nově zvládne animované GIFy.

    Ladislav Hagara | Komentářů: 1
    Jaký je váš oblíbený skriptovací jazyk?
     (57%)
     (29%)
     (7%)
     (2%)
     (0%)
     (1%)
     (3%)
    Celkem 289 hlasů
     Komentářů: 16, poslední 8.6. 21:05
    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
    20.6.2009 07:31 Andrej | skóre: 51 | blog: Republic of Mordor
    Rozbalit Rozbalit vše Další překvapivý příklad

    Ještě tu mám dva zdrojáky, ve kterých funkce volaná v odděleném vlákně mění lokální proměnnou jiného vlákna, na které závisí další běh programu.

    Napřed bez synchronizačních primitiv:

    #include <unistd.h>
    #include <stdio.h>
    #include <pthread.h>
    
    static void * setzero( void * param ) {
            *( (int *) param ) = 0;
            return NULL;
    }
    
    int main( void ) {
            int local = 1;
            pthread_t thread;
    
            pthread_create( &thread, NULL, setzero, &local );
            while ( local );
            pthread_join( thread, NULL );
            puts( "The thread has finished." );
            return 0;
    }

    Tohle dopadne zruba takto:

      -O0 -O1+
    GCC skončí zamrzne
    ICC skončí skončí

    Chování GCC je zcela podle předpokladů. Proměnná není není chráněna primitivem a zároveň není volatile, tudíž při zapnutí optimalizace původní záměr samozřejmě selže. Proč ale kód z ICC nezamrzne? Je to absurdní, ale ICC celý while cyklus odstraní!

    Naskýtá se otázka: Že by snad ICC analyzoval vytváření vláken a zjistil, co se může s tou proměnnou stát? Ne, to se neděje. Je snadné to dokázat: Když ve funkci setzero() přiřadíme místo nuly například dvojku, while cyklus bude odstraněn taky. A to je naprosto špatně. Je to bug v kompilátoru, nebo jen v mé hlavě? V assembleru je přesně toto:

            pushl     %eax                                          #14.42
            pushl     $setzero                                      #14.42
            pushl     $0                                            #14.42
            pushl     %edx                                          #14.42
            call      pthread_create                                #14.2
                                    # LOE ebx esi edi
    ..B1.2:                         # Preds ..B1.7
            pushl     $0                                            #16.24
            pushl     32(%esp)                                      #16.24
            call      pthread_join                                  #16.2

    Teď druhý kousek, tentokrát se synchronizačními primitivy.

    #include <unistd.h>
    #include <stdio.h>
    #include <pthread.h>
    
    static pthread_mutex_t mutex;
    static pthread_cond_t cond;
    
    static void * setzero( void * param ) {
            *( (int *) param ) = 0;
            pthread_cond_signal( &cond );
            return NULL;
    }
    
    int main( void ) {
            int local = 1;
            pthread_t thread;
    
            pthread_mutex_init( &mutex, NULL );
            pthread_cond_init( &cond, NULL );
            pthread_create( &thread, NULL, setzero, &local );
    
            pthread_mutex_lock( &mutex );
            while ( local ) pthread_cond_wait( &cond, &mutex );
            pthread_mutex_unlock( &mutex );
    
            pthread_join( thread, NULL );
            puts( "The thread has finished." );
            pthread_cond_destroy( &cond );
            pthread_mutex_destroy( &mutex );
            return 0;
    }
    

    Funkce setzero() vůbec nezamyká mutex, když signalizuje změnu podmínkové proměnné. Nicméně podle manuálové stránky je něco takového povoleno. Vše funguje zcela korektně pro všechny úrovně optimalizace u GCC i ICC. I z pohledu assembleru je vše v pořádku, lokální promměná v cyklu v main() se skutečně vždy načte znovu.

    Tady je fragment assembleru z kompilátoru Intel při -O3, který odpovídá té smyčce v main():

    ..B1.5:                         # Preds ..B1.20 ..B1.19
            movl      4(%esp), %eax                                 #22.10
            testl     %eax, %eax                                    #22.10
            je        ..B1.10       # Prob 10%                      #22.10
                                    # LOE ebx esi edi
    ..B1.7:                         # Preds ..B1.5
            pushl     $mutex.0                                      #22.44
            pushl     $cond.0                                       #22.44
            call      pthread_cond_wait                             #22.18
                                    # LOE ebx esi edi
    ..B1.20:                        # Preds ..B1.7
            addl      $8, %esp                                      #22.18
            jmp       ..B1.5        # Prob 100%                     #22.18
                                    # LOE ebx esi edi
    

    Dokonce ani lokální proměnná tedy nemusí být volatile, když se používá jako podmínková. V případě inlinování pthread_cond_wait() by to dopadlo stejně, protože tato funkce musí za všech okolností obsahovat speciální instrukce a tudíž i blok asm volatile s kouzelným slovem "memory" v seznamu změněných registrů.

    Začínám být čím dál pevněji přesvědčen, že podmínková proměnná nikdy nemusí být volatile a že toto chování překladačů se ani v budoucnu nemůže změnit.

    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.