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

发布于 2024-12-04 06:46:14 字数 213 浏览 2 评论 0原文

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

  1. 它可以从任意数量的线程中使用。
  2. 线程每次都应该获得唯一的值,直到溢出。
  3. 如果整数类型范围溢出,则应返回零。
  4. 我可以使用原子增量函数(返回旧值)和原子比较和交换函数。

到目前为止,我提出的所有场景都受到溢出竞争条件的影响。是否可以在这些限制下实现计数器?

I am writing a bit of code that implements an (unsigned) integer counter.

  1. It is used from an arbitrary number of threads.
  2. A thread should get a unique value every time until overflow.
  3. If integer type range is overflown, zero should be returned.
  4. I have at my disposal atomic increment function (returns old value), and atomic compare-and-swap function.

All scenarios I have come up with so far suffer from race conditions on overflow. Is it possible to implement the counter with these constraints?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

音盲 2024-12-11 06:46:14

您可以通过比较和交换来构建一切。一般算法是

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发生)。

You can build everything from compare-and-swap. The general algorithm is

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;
}

(I'm assuming that compare_and_swap takes a variable, a comparison value, and a swap value, and it returns true if the comparison succeeded (and the swap occurred).

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文