我的互斥锁实现只是在 CAS 失败时重试(伪代码):
while(!compare_and_swap(&mutex, 0, 1));
但是它浪费了太多的CPU周期。
我了解到“指数退避”可以提高整体性能。如何在 C 中实现退避延迟?
- 是否有精确的计时器 API(用于实现退避延迟)?
- 操作系统是否提供任何工具来实现退避?
我的互斥锁实现只是在 CAS 失败时重试(伪代码):
while(!compare_and_swap(&mutex, 0, 1));
但是它浪费了太多的CPU周期。
我了解到“指数退避”可以提高整体性能。如何在 C 中实现退避延迟?
指数退避是一种简单的算法,可以在重复失败的情况下成倍地降低尝试率。是的,如果许多线程不断访问共享变量,在重试 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
根据自己的喜好选择合理的值。