Есть ли какие-нибудь простые примеры, которые кто-то может привести?
Вот простой пример: фрагмент кода, возможно, должен получить две блокировки, A и B, например, чтобы он мог атомарноизменить два фрагмента данных, один защищенный A, а другой B. Например:
pthread_mutex_t a, b;
pthread_mutex_lock(&a);
pthread_mutex_lock(&b);
// ... process data protected by A and B
pthread_mutex_unlock(&b);
pthread_mutex_unlock(&a);
В то же время другой фрагмент кода может иметь то же требование, но просто получить блокировки вобратный порядок:
pthread_mutex_lock(&b);
pthread_mutex_lock(&a);
// ... process data protected by A and B
pthread_mutex_unlock(&a);
pthread_mutex_unlock(&b);
В отдельности любой подход работает просто отлично.Но когда две части кода выполняются одновременно, может произойти следующее:
// neither lock is held
// thread 1 // thread 2
pthread_mutex_lock(&a); pthread_mutex_lock(&b);
// thread 1 now holds A // thread 2 now holds B
// thread 1 is waiting for B // thread 2 is waiting for A
pthread_mutex_lock(&b); pthread_mutex_lock(&a);
Последняя строка представляет собой deadlock : поток 1 заблокирован в ожидании блокировки B, которая удерживаетсяПоток 2. Поток 2 заблокирован в ожидании блокировки A, которая удерживается потоком 1. Как написано, потоки заблокированы на неопределенный срок, и ни один из них не может продолжить.