Вернуть объект после сравнения и замены, если НЕ равны?

У меня есть класс с атомарной переменной:

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

Я хочу «получить» _a, только когда это не конкретное значение. Если это соответствует недопустимому значению, мы должны вернуть false, в противном случае мы должны сделать_a ноль и верните истину. Я думал о чем-то вроде этого:

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

Однако проблема в том, что я пытаюсь использовать сравнение-обмен не для равных, а скорее не для равных.

У кого-нибудь есть умный способ сделать это без использования замков?

2

Решение

Вы можете сделать это, где 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;
}
0

Другие решения