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

6 c performance

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

while(!compare_and_swap(&mutex, 0, 1));
Run Code Online (Sandbox Code Playgroud)

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

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

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

Eit*_*n T 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

请注意,限制延迟以防止"永恒"睡眠是个好主意.MAX_DELAY根据自己的喜好选择合理的价值.

  • 并在成功连接后将延迟重置为起始值. (2认同)
  • @ mpez0当然.但是,在我开始另一个CAS程序之前,我宁愿重新初始化延迟. (2认同)