Hi, On 2024-02-23 10:25:00 -0800, Jeff Davis wrote: > On Fri, 2024-02-23 at 10:17 -0600, Nathan Bossart wrote: > > The idea is > > to provide an easy way to remove spinlocks, etc. and use atomics for > > less > > performance-sensitive stuff. The implementations are intended to be > > relatively inexpensive and might continue to improve in the future, > > but the > > functions are primarily meant to help reason about correctness. > > To be clear: > > x = pg_atomic_[read|write]_membarrier_u64(&v); > > is semantically equivalent to: > > pg_memory_barrier(); > x = pg_atomic_[read|write]_u64(&v); > pg_memory_barrier(); > ? > > If so, that does seem more convenient.
Kinda. Semantically I think that's correct, however it doesn't commonly make sense to have both those memory barriers, so you wouldn't really write code like that and thus comparing on the basis of convenience doesn't quite seem right. Rather than convenience, I think performance and simplicity are better arguments. If you're going to execute a read and then a memory barrier, it's going to be faster to just do a single atomic operation. And it's a bit simpler to analyze on which "side" of the read/write the barrier is needed. Greetings, Andres Freund