Дедлок - это взаимная блокировка нескольких потоков или процессов, ожидающих высвобождения занятых друг другом ресурсов.
Конечно, дедлок относится к тем понятиям, которые лучше изучать теоретически, а не на практике. И если вы до сих пор не знаете, что такое дедлок, надо думать, вы никогда с ним и не сталкивались (хотя, конечно, не факт), и я вам от души желаю, чтобы и дальше вы с ним не столкнулись.
Дедлок (англ. deadlock, что на русский можно перевести как "мёртвая блокировка", хотя встречается и вариант термина "взаимная блокировка") - это ситуация, когда несколько процессов или потоков, взаимно заблокировав друг для друга доступ к некому общему для них всех ресурсу, бесконечно долго ожидают его освобождения. Такая ситуация чаще всего возникает при работе с базами данных, хотя может сложиться и в многопоточном приложении.
Простейшая ситуация, приводящая к deadlock'у, такова: у нас есть два процесса (или потока) и два ресурса, доступ к которым каждый из процессов намерен захватить. Первый процесс захватывает один ресурс, второй - оставшийся, и, выполнив какие-то действия с этими ресурсами, процессы начинают ожидать, когда освободится второй из нужных для них ресурсов. Конечно, вы можете сказать, что такой проблемы не было бы, если бы процесс сначала освобождал ресурс, а потом уже ожидал освобождения другого ресурса. Однако, к сожалению, не всё так просто, и далеко не всегда это возможно. Например, вполне может сложиться ситуация, когда каждому из процессов необходим эксклюзивный доступ к каждому их ресурсов для завершения выполнения какой-либо операции. Стоит заметить, что процессов/потоков, участвующих в дедлоке, может быть и не два, а значительно больше - тогда говорят о кольцевой блокировке.
Дедлок - особенно неприятная ситуация по той причине, что её довольно трудно воспроизвести, что называется, в лабораторных условиях, то есть при отладке приложения. Соответственно, довольно трудно исправить такую ошибку в программе, которая приводит её к дедлоку. Поэтому методы устранения дедлоков носят превентивный характер и используются уже на этапе проектирования программного продукта. Для того, чтобы предотвратить дедлок, стараются исключить одно из условий его возникновения, то есть, например, освобождать одни ресурсы до начала ожидания предоставления доступа к другим, либо же реализуют специальные менеджеры ресурсов, следящие за тем, чтобы не возникало дедлоков, и принудительно устраняющие их. Во многих современных СУБД есть такие менеджеры ресурсов.
Вадим СТАНКЕВИЧ
Горячие темы