6

我的互斥锁实现只是在 CAS 失败时重试(伪代码):

while(!compare_and_swap(&mutex, 0, 1));

但是它浪费了太多的CPU周期。

我了解到“指数退避”可以提高整体性能。如何在 C 中实现退避延迟?

  • 是否有精确的计时器 API(用于实现退避延迟)?
  • 操作系统是否提供任何工具来实现退避?
4

1 回答 1

12

指数退避是一种简单的算法,可以在重复失败的情况下成倍地降低尝试率。是的,如果许多线程不断访问共享变量,在重试 CAS 之前稍等片刻通常可以提高整体性能。

实现这一原则的最简单想法是使用指数增长的睡眠。例如:

#include <unistd.h>

// ...

useconds_t delay = 100000; // Delay in usec

while (!compare_and_swap(&mutex, 0, 1))
{
    usleep(delay);
    if (delay < MAX_DELAY)
    {
        delay *= 2;
    }
}

请注意,最好限制延迟以防止“永远”睡眠。MAX_DELAY根据自己的喜好选择合理的值。

于 2013-10-29T11:56:45.700 回答