ptmalloc_lock_all странный цикл - PullRequest
2 голосов
/ 15 марта 2019

Я пытаюсь понять часть кода в glibc. Зачем идти на этот странный цикл? Я предполагаю, что оптимизация компилятора по какой-то причине?

 237   for (ar_ptr = &main_arena;; )
 238     { 
 239       (void) mutex_lock (&ar_ptr->mutex);
 240       ar_ptr = ar_ptr->next;
 241       if (ar_ptr == &main_arena)
 242         break;
 243     }

1 Ответ

2 голосов
/ 15 марта 2019

Что вы находите странным в этом цикле?

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

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

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

Вы можете написать проверенные в конце циклы с помощью do ... while, но эта конструкция не позволяет инициализировать переменную цикла.

...