我的互斥实现只是重试CAS失败(伪代码):
while(!compare_and_swap(&mutex, 0, 1));
但它浪费了太多的CPU周期。
我了解到“指数退避”可以提高整体性能。如何在C?
中实现退避延迟答案 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
选择合理的值。