c++ - 如果不相等,比较和交换后返回对象?

标签 c++ multithreading c++11 atomic compare-and-swap

我有一个带有原子变量的类:

class{
    public:
        std::atomic<int> _a;
};

我想“检索”_a,只有当它不是特定值时。如果它匹配无效值,我们应该返回 false,否则我们应该将 _a 置零并返回 true。我想到了这样的事情:

bool retrieveIfValid(int& result){
    int valueAShouldNotBeQualTo = 9999999;
    bool success = _a.compare_exchange_weak();    // Need to exchange when _a NOT equal to valueAShouldNotBeQualTo
    result = _a.load();
    return success;
}

但是,问题是我尝试使用比较交换不是为了相等,而是为了不相等。

有没有人有不使用锁的聪明方法?

最佳答案

你可以这样做,其中 result 始终携带 _a 的当前值

bool retrieveIfValid(int& result)
{
    int valueAShouldNotBeQualTo = 9999999;

    result = _a.load();

    do {

        if (result == valueAShouldNotBeQualTo)
            return false;

    } while (!_a.compare_exchange_weak(result, 0));

    result = 0; // _a was changed to 0
    return true;
}

关于c++ - 如果不相等,比较和交换后返回对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31318994/

相关文章:

c++ - 在理解 move 语义的同时混淆c++程序中的操作

c++ - 忽略函数默认参数

c++ - 可以在字符串上使用 htonl

c++ - qt 线程与 movetothread

java - 在 ExecutorService 上调度的守护线程;解释为什么这是不好的形式

c - 使用c中的线程对矩阵中的元素求和

c# - 如何创建自定义 SynchronizationContext 以便所有延续都可以由我自己的单线程事件循环处理?

只能被其他开发者函数调用的C++开发者函数

c++ - 怎么可能有两个同名变量——一个是全局变量,另一个是局部变量?

c++ - clang 3.5 constexpr 不一致 - 使用 double 而不是 int 时出错