Hacker News new | ask | show | jobs
by liquid153 838 days ago
Aren't lock free buffers usually just as expensive or more expensive to use as locks.
4 comments

No -- for a lock-free design with a single producer and consumer, it's possible both are typically writing to independent regions of memory. With a lock, both have to write the same cache line to take and release the lock.
Not if your program needs to be realtime or near realtime safe. Locks are controlled by the OS typically, and can have non-deterministic latency.
Even ignoring mutexes and OS scheduling, plain spinlocks add contention that would not otherwise exist in a SPSC ringbuffer. https://news.ycombinator.com/item?id=39551575
Lock free has two advantages: the checking code can run in user mode and non-contested access is very cheap with just one instruction.

To do it correctly, lock needs to be done in the kernel thus obtaining a lock requires calling into the kernel which is more expensive.

I think you meant the memory barrier for syncing cache is just as expensive as the lock version, which is true.

Obtaining an uncontested lock absolutely doesn't require calling into the kernel
How can you give hard guarantees that on Windows, Mac, Linux with the OS and/or libc provided locks?
If you really really really need such a guarantee, you implement your own.

Otherwise you inspect the implementation, but in 2024 a fast-pathed OS lock is table stakes.

Rust (which is what we're discussing here) actually doesn't promise this in general. But for the three operating systems you mentioned that is in fact what it delivers because as another commenter mentioned it's table stakes. If your OS can't do this it's a toy OS.

The Windows and Linux solutions are by Mara Bos (the MacOS one might be too, I don't know)

The Windows one is very elegant but opaque. Basically Microsoft provides an appropriate API ("Slim Reader/Writer Locks") and Mara's code just uses that API.

The Linux one shows exactly how to use a Futex: if you know what a futex is, yeah, Rust just uses a futex. If you don't, go read about the Futex, it's clever.

Because not doing that these days would be malpractice for an OS of that caliber.
No, where are you getting that information?