У меня есть класс с атомарной переменной:
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;
}
Однако проблема в том, что я пытаюсь использовать сравнение-обмен не для равных, а скорее не для равных.
У кого-нибудь есть умный способ сделать это без использования замков?
Вы можете сделать это, где 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;
}