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