我试图理解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 }
答案 0 :(得分:2)
在该循环中您发现什么奇怪?
显然,main_arena
是循环链接列表的开头。要遍历循环列表,请遵循下一个链接,直到回到开始为止。但是您必须在循环结束时进行测试,因为退出条件在第一次迭代中为真。
循环链接列表非常普遍,尤其是在双向链接列表中。使列表为圆形可以避免很多特殊情况下的插入和删除操作检查。
在这种情况下,每个列表项中都有一个互斥锁,循环的重点是锁定所有互斥锁。这可能就是为什么该函数称为lock_all
的原因。
您可以使用do ... while
编写经过最终测试的循环,但是该构造无法初始化循环变量。