ptmalloc_lock_all怪异的循环

时间:2019-03-14 22:22:44

标签: c memory heap

我试图理解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     }

1 个答案:

答案 0 :(得分:2)

在该循环中您发现什么奇怪?

显然,main_arena是循环链接列表的开头。要遍历循环列表,请遵循下一个链接,直到回到开始为止。但是您必须在循环结束时进行测试,因为退出条件在第一次迭代中为真。

循环链接列表非常普遍,尤其是在双向链接列表中。使列表为圆形可以避免很多特殊情况下的插入和删除操作检查。

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

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