У меня есть структура в союзе с uint64_t, обеспечивающая доступ к двум int32_t. Я хотел бы уменьшить один из элементов структуры атомарно. Я пришел с этим:Атомно декремент данных члена союза?
class{
public:
void atomicallyDecrement_B(const int32_t decrementByThisValue){
MyUnion newUnion;
MyStruct currentStruct = _union._data;
do{
const int32_t currentB = currentStruct.b;
const int32_t currentA = currentStruct.a;
const int32_t newB = currentB - decrementByThisValue;
newUnion._data.a = currentA;
newUnion._data.b = newB;
}
while(!std::atomic_compare_exchange_weak(&_union._data, ¤tStruct, newUnion._data));
}
private:
struct MyStruct{
int a;
int b;
};
union MyUnion{
MyUnion(){
_data.a = 0;
_data.b = 0;
}
MyStruct _data;
uint64_t _atomic;
} _union;
};
но это, кажется, первый аргумент atomic_compare_exchange_weak()
должен быть сам атомный тип. Есть ли способ выполнить эту операцию без, изменяя член данных uint64_t равным std::atomic<uint64_t>
?
Я использую GCC 5.2
Вы не можете атомарно доступ к не -атомный тип данных. Если вы не хотите, чтобы он был атомарным, вам лучше защищать доступ с помощью блокировки. – Brian
Существуют нестандартные способы сделать это - каждая среда компилятора/сборки создала свой собственный, прежде чем атом появился в стандарте. Если это поможет, укажите, какой компилятор вы используете и на какой платформе вы работаете. –
@DaleWilson компилятор специфичен, я использую GCC 5.2 – user997112