【问题标题】:atomic compare_exchange_weak having an atomic expected valueatomic compare_exchange_weak 具有原子期望值
【发布时间】:2013-11-21 03:53:39
【问题描述】:

我正在尝试确定在 c++ 中使用原子进行 CAS 的最佳方法是什么。 我的例子:

atomic<int> foo(0), bar(1);
while(!foo.compare_exchange_weak(bar, 2)) {}

给出错误:

没有匹配函数调用'std::atomic::compare_exchange_weak(std::atomic&, int)

本质上,我想做的是将 foo 的旧值存储在 bar 中,它本身就是一个原子类型。上述错误的解决方法是:

atomic<int> foo(0), bar;
int tmp = 1;
do
{
    bar = tmp;
}
while(!foo.compare_exchange_weak(tmp, 2));

遵守 compare_exchange_weak 的约定,仅当 bar 在 foo 变为 2 时具有 foo 的值时才退出循环。

然而,我不确定这是否是最好的方法。在我看来,我想做的第一件事就是正确的方法。关于什么是合适的,以及第二种解决方案是否可以?

谢谢。

【问题讨论】:

    标签: multithreading c++11 atomic


    【解决方案1】:

    我意识到这个问题已经提出了一段时间,但我今天遇到了同样的错误。

    第一个示例编译失败,因为您使用atomic&lt;int&gt; 而不仅仅是int 作为compare_exchange_weak 的参数。以下在我的电脑上编译并运行:

    atomic<int> foo(0);
    int bar(1);
    while(!foo.compare_exchange_weak(bar, 2)) {}
    

    我认为在您提供的示例中,两个循环是等效的。问题在于参数的类型,而不是逻辑。

    【讨论】:

    • 我会接受这个作为答案,因为它符合documentation,但是,您提供的代码并不相同。我特别希望 bar 是原子的。我想我必须使用第二个循环。