Vývojářský blog Tomáše Jechy

Tisk článku Tisk článku

Hardcore C# hádanka

[Zpět na blog]

Datum: 18. 5. 2010 0:05       Autor: Tomáš Jecha       Zobrazeno: 2908x

Kategorie: C#


Při programování více vláknových aplikací jsem se poprvé setkal s jedním poměrně nepříjemným jevem, o který se s vámi chci podělit.

Tak schválně, kdo z vás zná opravdu dobře C#? Prohlédněte si následující kód:

     class Program
    {
        
static bool exit = false;

        
static void Main(string[] args)
         {
            
Console.WriteLine("Začátek.");

            
var loopThread = new Thread(LoopTilExit);
             loopThread.Start();

            
Thread.Sleep(500);
             exit =
true;

             loopThread.Join();
            
Console.WriteLine("Konec.");
            
Console.ReadLine();
         }

        
static void LoopTilExit()
         {
            
int a = 0;
            
while (!exit)
             {
                 a++;
             }
         }
     }

    Je v něm všechno v pořádku? … Odpověď zní – ne, není. Je v něm poměrně závažná chyba.

    Zkuste mi odpovědět na tyto otázky:

    • Za jakých podmínek se následující kód zadeadlockuje?

    • Proč se to stane a proč se to stane jen někdy?

    • Jak tomu zabránit?

        Odpovědi pište na tomas[zavinutá-rybička]jecha.net. První korektní řešitel bude odměněn drobným dárkem.


        > Na začátek

         

        Hodnocení:

        Hlasů: 7
        Zvolte své hodnocení

        Tomáš Jecha

        Tomáš Jecha již několikátým rokem získal ocenění Microsoft MVP. V současné době pracuje ve společnosti AVAST jako architekt a vývojář interních systémů. Působí také jako lektor a konzultant v počítačové škole Gopas. V současné době se zajímá především o SQL Server a technologie nad .NET Frameworkem 4. Společně s Tomášem Hercegem napsal tento web a stará se o jeho administraci.

        Podpořte vznik dalších článků
        RSS Feed RSS Feed

        Diskuse

        1 

        Deadlock

        Datum: 18.5.2010 1:21
        Autor: Tomáš Herceg
        Hodnocení autora: 1660
        Příspěvků: 3533
        Je tu drobná terminologická nepřesnost v zadání. Určitě nemůže nastat deadlock - deadlock je situace, kdy jedno vlákno čeká na druhé a druhé na první, případně víc vláken na sebe čeká v cyklu. Tady druhé vlákno nečeká na první, takže fakticky nejde o deadlock, jen o pouhé zacyklení.
         
                   [Odpovědět]
         
        Hodnocení: 1 Čekejte, prosím...

        Re: Deadlock

        Datum: 18.5.2010 3:36
        Autor: Tomáš Jecha
        Hodnocení autora: 697
        Příspěvků: 1285
        Nemám rád slovíčkaření - a tohle rozhodně velké slovíčkaření je.

        Ale i tak nesmyslím, že máš pravdu. Protože ony totiž ty vlákna na sebe ve skutečnosti opravdu vzájemně čekají. A tím se splňuje podstata definice deadlocku. A je už úplně jedno, jestli je to čekání realizováno cyklem nebo čímkoliv jiným (událostí ukončení vlákna atp.).

        Jen pro upřesnění, aby v tom bylo jasno - běží vedle sebe dvě vlákna - vedlejší vlákno čeká na signál přes proměnnou z hlavního vlákna a zároveň hlavní vlákno čeká na ukončení vedlejšího vlákna. Ale nechci se v tom tolik šťourat, abych to neprozradil.

        Až pochopíš, proč je to vlastně deadlock, tak uvidíš i důvod, proč nastává.
         
                   [Odpovědět]
         
        Hodnocení: 0 Čekejte, prosím...

        Re: Deadlock

        Datum: 18.5.2010 10:56
        Autor: Tomáš Herceg
        Hodnocení autora: 1660
        Příspěvků: 3533
        O deadlocku se mluví v případě pasivního čekání, kdy se čeká na nějakém zámku, mutexu nebo jiném synchronizačním primitivu, prostě čeká se na uvolnění nějakého sdíleného prostředku.
        Tady máš čekání aktivní, jedno vlákno stojí, ale druhé pořád běží a vytěžuje procesor. Co konkrétně to vlákno dělá, není podstatné, ono prostě běží. Definici deadlocku to zkrátka nevyhovuje. Jasně, je to slovíčkaření a taky ho nemám rád, omlouvám se.
         
                   [Odpovědět]
         
        Hodnocení: 1 Čekejte, prosím...

        Re: Deadlock

        Datum: 18.5.2010 11:07
        Autor: Tomáš Jecha
        Hodnocení autora: 697
        Příspěvků: 1285
        Pokud vím, tak deadlock není omezen jen na pasivní čekání, ačkoliv je to v 99% případech pravda. Pokud to tak je, tak oba známe jinou definici. Jenže to už se vracíme ke slovíčkaření. Navíc nemyslím, že v tomto případě je termín deadlock úplně od věci, protože ono zacyklení vzniká právě kvůli čekání na druhé vlákno.
         
                   [Odpovědět]
         
        Hodnocení: 0 Čekejte, prosím...

        Re: Deadlock

        Datum: 7.9.2010 8:39
        Autor: neregistrovaný (217.198.112.101)
        Hodnocení autora: není
        Příspěvků: 0
        Toto opravdu není deadlock :-)
        Na deadlock jsou potřeba minimálně dva zdroje a dva procesy.
        Ke zdrojům může přistupovat v jednu chvíli jen jeden proces.
        Každý z procesů drží jeden zdroj, a každý z procesů chce přístup i k druhému zdroji. Takhle nám to vtloukali do hlavy na FI MU, tak to snad bude pravda :-D.

        http://cs.wikipedia.org/wiki/Deadlock
        http://cs.wikipedia.org/wiki/Nekone%C4%8...

        Slovíčkaření toto není, nazývejme věci pravými jmény.
         
                   [Odpovědět]
         
        Hodnocení: 0 Čekejte, prosím...

        Re: Deadlock

        Datum: 7.9.2010 9:14
        Autor: Tomáš Herceg
        Hodnocení autora: 1660
        Příspěvků: 3533
        To, že vás něco učí ve škole (i když je vysoká), nemusí nutně znamenat, že to je pravda.
        Na deadlock opravdu nemusí být dva procesy, stačí dvě vlákna.
        Wikipedia také není úplně spolehlivý zdroj informací.
         
                   [Odpovědět]
         
        Hodnocení: 1 Čekejte, prosím...

        atomicky boolean

        Datum: 19.5.2010 20:35
        Autor: neregistrovaný (84.42.169.66)
        Hodnocení autora: není
        Příspěvků: 0
        ja som javista a C# vobec nepouzivam, ale tipoval by som to na "problem" toho statickeho exit flagu, ktory nie je atomicky a preto moze nastat to, co popisujes.

        BTW: naozaj obaja nemate radi slovickarenie? :)
         
                   [Odpovědět]
         
        Hodnocení: 0 Čekejte, prosím...

        Re: atomicky boolean

        Datum: 19.7.2010 7:16
        Autor: neregistrovaný (78.24.12.98)
        Hodnocení autora: není
        Příspěvků: 0
        Chtěl jsem se zeptat zda-li bude někdy vyhlášena správná odpověď a případní výherci soutěže?
        děkuji
         
                   [Odpovědět]
         
        Hodnocení: 0 Čekejte, prosím...

        Re: atomicky boolean

        Datum: 5.8.2010 12:39
        Autor: neregistrovaný (82.150.191.19)
        Hodnocení autora: není
        Příspěvků: 0
        je treba pouzivat modifier 'volatile' pro policku 'field', jinak JIT kompilator muze nacachovat policku do registru.
         
                   [Odpovědět]
         
        Hodnocení: 0 Čekejte, prosím...
        1 
         

        VBNET.CZ | © 2007 Tomáš Herceg, Tomáš Jecha | Kopírování a přejímání jakéhokoliv obsahu z tohoto webu je bez písemného svolení autorů zakázáno.