next up previous contents
Next: Переменные состояния. Up: Синхронизация потоков. Previous: Иерархия блокировок.   Contents

Вложенные блокировки односвязного списка.

Вложение элементов запирания мьютекса в связанную структуру данных и простые изменения в коде связного списка позволяют предотвратить тупик, осуществляя блокировку в предписанном порядке.

Структура для блокировки имеет вид:

typedef struct node1 { 

  int value; 

  struct node1 *link;

  pthread_mutex_t lock; 

} node1_t;

Теперь можно создать переменную для списка блокировок node1_t ListHead.

Чтобы удалить узел из списка, необходимо:

Код для удаления элемента из списка с вложенной блокировкой (рис. 30):

node1_t *delete(int value) {

  node1_t *prev,

  *current; prev = &ListHead;

  pthread_mutex_lock(&prev->lock); 

  while ((current = prev->link) != NULL) {

      pthread_mutex_lock(&current->lock); 

      if (current->value == value) {

         prev->link = current->link;

         pthread_mutex_unlock(&current->lock); 

         pthread_mutex_unlock(&prev->lock);

         current->link = NULL;

         return(current); 

      } 

      pthread_mutex_unlock(&prev->lock);

      prev = current; 

  } 

  pthread_mutex_unlock(&prev->lock); 

  return(NULL); 

}

Рис. 30. Доступ к списку с вложенной блокировкой.



2003-12-09