Что делает его тупиковым и как избавиться от тупика? - PullRequest
0 голосов
/ 11 июля 2020

У меня проблемы с пониманием того, насколько код удовлетворяет условиям тупиковой ситуации? И есть ли какие-либо предложения или стратегии, которые помогут избавиться от тупика кода?

Thread1()
{
    while (true)
    {
        lock1.acquire();
        lock2.acquire();
        CriticalSection();
        lock2.release();
        lock1.release();
    }
}

Thread2()
{
    while (true)
    {
        lock2.acquire();
        lock3.acquire();
        CriticalSection();
        lock3.release();
        lock2.release();
    }
}

Thread3()
{
    while (true)
    {
        lock3.acquire();
        lock2.acquire();
        CriticalSection();
        lock1.release();
        lock3.release();
    }
}

1 Ответ

0 голосов
/ 11 июля 2020

Тупиковая ситуация возникает, когда процесс пытается получить ресурс A, удерживая ресурс B, а другой процесс пытается получить B, удерживая A. Таким образом, в вашей программе поток 2 и поток 3 могут создать взаимоблокировку, потому что они оба пытаются получить lock2 и lock3. Если они получат эти ресурсы в том же порядке, программа будет безопасна в тупиковой ситуации. Например, если оба потока получают lock2 до lock3, то ни один процесс не может попытаться получить lock2, удерживая lock3. Однако в вашей программе поток 2 получает 2 перед 3, а поток 3 получает 3 перед 2, создавая потенциальную взаимоблокировку.

...