Пытаясь понять тупики в c - PullRequest
0 голосов
/ 16 декабря 2018

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

1 Ответ

0 голосов
/ 16 декабря 2018

Есть ли какие-нибудь простые примеры, которые кто-то может привести?

Вот простой пример: фрагмент кода, возможно, должен получить две блокировки, 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. Как написано, потоки заблокированы на неопределенный срок, и ни один из них не может продолжить.

...