Добавить в корзинуПозвонить
Найти в Дзене
Kamnetanker

Как получить DeadLock

Почти всегда в процессе написания кода программисты стараются избежать любых возможных проблем, что приводит к непомерному удорожанию ПО. Однако бывает и обратная ситуация, когда нотка авантюриста в одном месте не даёт программисту сидеть спокойно и он хочет реализовать ту или иную ошибку. Одной из таких ошибок является DeadLock - ситуация, когда два и более процессов не могут высвободить заблокированный ресурс и циклично требуют ресурсы друг у друга. Так как же получить DeadLock? Условия получения DeadLock: 1. Условие взаимного исключения. Каждый ресурс в данный момент или отдан ровно одному процессу, или доступен. Это значит, что из запрашиваемых ресурсов нет ни одного свободного. 2. Условие удержания и ожидания. Процессы, в данный момент удерживающие полученные ранее ресурсы, могут запрашивать новые ресурсы. Например, если выводится на печать документ из сети может быть реализована схема с захватом сетевой подсистемы и системы принтера, при этом один из ресурсов всё равно будет за

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

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

Пример DeadLock
Пример DeadLock

Так как же получить DeadLock?

Условия получения DeadLock:

1. Условие взаимного исключения. Каждый ресурс в данный момент или отдан ровно одному процессу, или доступен. Это значит, что из запрашиваемых ресурсов нет ни одного свободного.

2. Условие удержания и ожидания. Процессы, в данный момент удерживающие полученные ранее ресурсы, могут запрашивать новые ресурсы. Например, если выводится на печать документ из сети может быть реализована схема с захватом сетевой подсистемы и системы принтера, при этом один из ресурсов всё равно будет захвачен первым и будет требоваться новый

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

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

Если хотя бы одно из вышеизложенных условий не выполняется, то ситуация DeadLock невозможна. Рассмотрим пример кода, который вызывает взаимную блокировку:

Пример взаимной блокировки CSharp
Пример взаимной блокировки CSharp

Если данный код вызвать из одного объекта в двух потоках, при этом в одном потоке Doing(), а в другом DoingElse() возникнет ситуация ожидания освобождения ресурса locker, чтобы получить цикличное ожидание, требуется добавить 2 объекта и сделать так, чтобы Doing() захватил сначала первый, а потом требовал второй, а DoingElse() захватил второй и требовал после первый, тогда возникнет цикличность ожидания и DeadLock. Развлекайтесь)

Не забудьте подписаться на канал и прочекать другие публикации. Заранее спасибо.