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
编写经过最终测试的循环,但该结构无法提供初始化循环变量的方法。
我正在尝试理解 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
编写经过最终测试的循环,但该结构无法提供初始化循环变量的方法。