ptmalloc_lock_all 奇怪的 for 循环

ptmalloc_lock_all weird for loop

我正在尝试理解 glibc 中的一些代码。为什么要使用这个奇怪的 for 循环?我猜编译器优化出于某种原因?

 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     }

你觉得那个循环有什么奇怪的地方?

可见,main_arena是循环链表的头部。要遍历循环列表,您可以跟随下一个链接,直到您发现自己回到开头。但是您必须在循环结束时进行该测试,因为退出条件在第一次迭代时为真。

循环链表很常见,尤其是双向链表。使列表循环避免了很多插入和删除操作的特殊情况检查。

在这种情况下,每个列表项中都有一个互斥量,循环的重点是锁定所有互斥量。这可能就是为什么函数被称为 lock_all.

的原因

您可以使用 do ... while 编写经过最终测试的循环,但该结构无法提供初始化循环变量的方法。