Нет, никакой гарантии на это не будет, что сделает код небезопасным (один поток может увидеть значение больше A
, а приращение может быть «потеряно» на place_st.exchange(0)
.
Самое простое, что можно сделать здесь, это просто считать place_st
«развернутым» и вручную делать uint64_t lpp = place_st++ % A
, чтобы получить «завернутую» версию. Кроме того, чтобы получить такое поведение, которое вам в основном нужно сравнить-and-swap в цикле (см. , как реализовать простое сравнение и замена в C ++ для общего счетчика ), а не атомарный прирост, чтобы получить приращение и перенос, чтобы вести себя атомарно. Так как вы толькоработая с одной переменной, вы можете использовать CAS для эмуляции подхода к транзакционной памяти, который вы рассматривали.