2 and 3 can be reordered. See Peter Cordes's answer here: https://stackoverflow.com/a/77080997/19260728
The store side of the ++x and the subsequent acquire load can be reordered unless you have a StoreLoad barrier - either std::atomic_memory_fence(std::memory_order_seq_cst), or just making load #3 also seq_cst