Я сталкиваюсь с ситуацией, когда мне нужна атомная сумма двух значений в памяти. Код, который я унаследовал выглядит следующим образом:Есть ли способ сделать два чтения атомарными?
int a = *MemoryLocationOne;
memory_fence();
int b = *MemoryLocationTwo;
return (a + b) == 0;
Человек читает а и Ь являются атомарными и все записи в другом месте в коде этих двух ячеек памяти также беззамочные атомарным. Однако проблема заключается в том, что значения двух местоположений могут и могут меняться между двумя считанными.
Как я могу сделать эту операцию атомной? Я знаю все о CAS, но он имеет тенденцию включать только операции чтения-изменения-записи атома, и это не совсем то, что я хочу сделать здесь.
Есть ли способ сделать это, или это лучший вариант для рефакторинга кода, так что мне нужно только проверить одно значение?
Редактировать: Спасибо, я не упомянул, что я хотел сделать это незаметно в первой ревизии, но некоторые люди подняли его после моей второй ревизии. Я знаю, что никто не верит людям, когда они говорят такие вещи, но я не могу использовать блокировки практически. Я должен был бы подражать мьютексу с атомикой, и это было бы больше работы, чем рефакторинг кода, чтобы отслеживать одно значение вместо двух.
На данный момент мой метод исследования включает в себя использование того факта, что значения последовательно и захватывают их атомарно с 64-битным чтением, которое, как я уверен, является атомарным на моих целевых платформах. Если у кого-то есть новые идеи, пожалуйста, внесите свой вклад! Благодарю.
Они случаются быть последовательными 32-битные адреса и процессоры мне нужно код для работы на есть атомный 64-битный читает, если правильно выровнены, так это похоже на путь вперед. –
Ах, в этом случае вы можете либо написать какую-нибудь сборку, либо просто проверить сборку вашего компилятора, чтобы убедиться, что использование 64-битного типа сделает все правильно. В этом случае вы можете отключиться. – Eddie