如何使用原子增量和比较和交换操作处理整数溢出?

时间:2011-09-13 04:16:45

标签: c++ multithreading atomic

我正在编写一些实现(无符号)整数计数器的代码。

  1. 从任意数量的线程中使用它。
  2. 线程每次都应该获得一个唯一值,直到溢出。
  3. 如果整数类型范围溢出,则应返回零。
  4. 我有处理原子增量函数(返回旧值)和原子比较和交换函数。
  5. 到目前为止,我提出的所有场景都会遇到溢出的竞争条件。是否可以使用这些约束来实现计数器?

1 个答案:

答案 0 :(得分:5)

您可以通过比较和交换构建所有内容。一般算法是

int DoSomeAtomicCalculation()
{
    static int value;
    int capture, newValue;
    do {
        capture = value;
        newValue = some_function_based_on(capture);
    } while (!compare_and_swap(value, capture, newValue));
    return newValue;
}

(我假设compare_and_swap接受变量,比较值和交换值,如果比较成功(并且发生交换),则返回true