К Т П           План занятия                                                              1                                           Страницы  | 1 | | 2 | | 3 | | 4 | | 5 | | 6 | | 7 | | 8 | | 9 |

1. Определение тупиков

Говорят, что поток находится в тупике (deadlock), если он ждет событие, которое никогда не произойдет. Событие может никогда не произойти по следующим двум причинам:

  1. Не существует потока, который оповещает о наступлении ожидаемого события;
  2. Поток, оповещающий о наступлении ожидаемого события, существует, но сам находится в тупике.

Если в тупике находится хотя бы один из потоков процесса, то считается, что этот процесс также находится в тупике. Если мы рассматриваем систему, которая состоит из нескольких процессов, и хотя бы один из этих процессов находится в тупике, то и сама рассматриваемая система также находится в тупике.
Например, рассмотрим два потока одного процесса:


void thread_1 ( )
{
EnterCriticalSection(&csl) ; cin >> a;
EnterCriticalSection(&cs2); x = a - b;
LeaveCriticalsection(&cs2);
LeaveCriticalsection(&csl) ;
}
void thread_2{ )
{
EnterCriticalSection(&cs2);

cin >> b;
EnterCriticalSection(&csl); у * a + b;
LeaveCriticalsection(&csl); LeaveCriticalsection(&cs2);

Если после операции ввода (сin >> а) в первом потоке выполнение этого потока прервется и управление будет передано второму потоку в функцию EnterCriticalSection(&cs2), то процесс войдет в тупик. Это Произойдет потому, что поток thread_1 будет ждать освобождения входа в критическую секцию cs2, которая занята потоком thread_2, а поток thread_2 будет ждать освобождения входа в критическую секцию cs1, которая занята потоком thread_1. Но эти события никогда не наступят. Таким образом, потоки thread_1 и thread_2 блокируют друг друга. Процесс находится в тупике, т. к. каждый поток ждет ресурс, захваченный другим потоком, при этом не освобождая принадлежащие ему ресурсы.

Аналогичная ситуация произойдет и в том случае, если после операции ввода (сin >>b) во втором потоке выполнение этого потока прервется и управление будет передано первому потоку В функцию EnterCriticalSection (&cs1).

Очевидно, что при разработке программ необходимо избегать ситуаций, которые могут привести к тупикам, т. к. в этом случае система становится неработоспособной. В следующих разделах мы рассмотрим способы обнаружения, предотвращения и восстановления после тупиков.

 


Предыдущая        В начало страницы       Следующая
1