如何在这个简单的互斥实现中实现“指数退避”?

时间:2013-10-29 11:46:01

标签: c performance

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

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

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

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

中实现退避延迟
  • 是否有精确的计时器API(实现退避延迟)?
  • OS是否提供实施退避的任何工具?

1 个答案:

答案 0 :(得分:12)

Exponential backoff是一种简单的算法,可以在重复失败的情况下以乘法方式降低尝试次数。是的,如果许多线程不断访问共享变量,在重试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选择合理的值。