我正在尝试理解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 }
发布于 2019-03-15 07:55:51
你在那个循环中发现了什么奇怪的东西?
显然,main_arena
是循环链表的头部。要遍历循环列表,您可以沿着下面的链接,直到您发现自己回到了开头。但您必须在循环结束时执行该测试,因为退出条件在第一次迭代时为真。
循环链表非常常见,特别是在双向链表中。使列表循环可以避免对insert和delete操作进行大量特殊情况检查。
在本例中,每个列表项中都有一个互斥锁,循环的目的是锁定所有互斥锁。这可能就是该函数被称为lock_all
的原因。
您可以使用do ... while
编写经过最终测试的循环,但是该构造不提供初始化循环变量的方法。
https://stackoverflow.com/questions/55172898
复制相似问题