still at the mercy of the hardware uncertainty when crossing clock domains
That was solved years ago. See "Arbiter (electronics)".[1] It's possible to resolve that uncertainty, but sometimes you have to take extra time to resolve the race condition. Think of this as being like resolving a coin flip. Sometimes, the coin lands on edge. You deal with that by adding some noise in the form of vibration and waiting. Repeat until the coin ends up on one face or the other.
(I had the painful experience of working on the OS for a multiprocessor mainframe which predated that solution, and did have race conditions on memory access.)
That was solved years ago. See "Arbiter (electronics)".[1] It's possible to resolve that uncertainty, but sometimes you have to take extra time to resolve the race condition. Think of this as being like resolving a coin flip. Sometimes, the coin lands on edge. You deal with that by adding some noise in the form of vibration and waiting. Repeat until the coin ends up on one face or the other.
(I had the painful experience of working on the OS for a multiprocessor mainframe which predated that solution, and did have race conditions on memory access.)
[1] https://en.wikipedia.org/wiki/Arbiter_(electronics)