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