Yksinkertaistettu esimerkki Deadlock-tilanteesta ================================================ "Ruokailevat nörtit" Pöydässä on Essi ja Jopi, joilla kummallakin on edessään ruokaa, mutta pöydässä on vain yksi haarukka ja yksi veitsi. Paikalla on myös Ossi, joka valvoo ruokailun toimintaa seuraavasti: - Essi ja Jopi eivät saa tehdä yhtäaikaa mitään, vaan kukin vuorollaan, pikku hetki kerrallaan (vähän niin kuin Pros-essit tai "jobit" käyttöjärjestlemän eli OS:n vuorontamina). - Veistä kuin myös haarukkaa voi käyttää vain yksi henkilö kerrallaan. Muiden täytyy jonottaa resurssin käyttövuoroa. Jopi aikoo syödä omalla ruokailualgoritmillaan: 1. Varaa haarukka 2. Varaa veitsi 3. Syö ruoka 4. Vapauta veitsi 5. Vapauta haarukka Essi puolestaan aikoo syödä omalla ruokailualgoritmillaan: 1. Varaa veitsi 2. Varaa haarukka 3. Syö ruoka 4. Vapauta haarukka 5. Vapauta veitsi Kaikki menee hyvin, jos Essi tai Jopi ehtii varata sekä haarukan että veitsen ennen kuin Ossi keskeyttää ja antaa vuoron toiselle ruokailevalle nörtille. Mutta huonosti käy, jos... -------------------------- 1: Jopi varaa haarukan 2: Ossi siirtää vuoron Essille; Jopi jää odottamaan suoritusvuoroaan 3: Essi varaa veitsen 4: Essi yrittää varata haarukan 5: Ossi laittaa Essin jonottamaan haarukkaa, joka on jo Jopilla. Sitten Ossi antaa vuoron Jopille, joka on valmiina jatkamaan. 6: Jopi yrittää varata veitsen 7: Ossi laittaa Jopin jonottamaan veistä, joka on jo Essillä. 8: Sekä Jopi että Essi jonottavat resurssin vapautumista ja nääntyvät oikein kunnolla. Mitään ei enää tapahdu; ruokailijat ovat ns. Deadlock -tilanteessa eli odottavat toistensa toimenpiteiden valmistumista. Algoritmeja on säädettävä esim. ruokailu_MutEx -semaforin avulla: Jopi: 1. Wait(ruokailu_MutEx) -- Ossi hoitaa yksinoikeuden 2. Varaa haarukka 3. Varaa veitsi 4. Syö ruoka 5. Vapauta veitsi 6. Vapauta haarukka 7. Signal(ruokailu_MutEx) -- Ossi hoitaa Essi: 1. Wait(ruokailu_MutEx) -- Ossi hoitaa yksinoikeuden 2. Varaa veitsi 3. Varaa haarukka 4. Syö ruoka 5. Vapauta haarukka 6. Vapauta veitsi 7. Signal(ruokailu_MutEx) -- Ossi hoitaa Nyt kun Jopi tai Essi ensimmäisenä varaa poissulkusemaforin, toinen ruokailija päätyy Ossin hoitamaan jonotukseen, kunnes ensimmäinen varaaja on ruokaillut kokonaan ja ilmoittanut lopettaneensa. Ossi päästää seuraavan jonottajan ruokailemaan eikä lukkiutumista tapahdu. Vaarana on enää, että vain joko Jopi tai Essi joutuu hetken aikaa nääntymään nälkään, kunnes toinen on syönyt loppuun ja vapauttanut ruokailu_MUTEXin. Väliaikainen nälkiintyminen (starvation) on siis kevyempi muoto lopullisesta lukkiutumisesta (deadlock).