我有一个带有原子变量的类:
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/