The main reason for using atomics over mutexes, is that mutexes are expensive but with the default memory model for atomics
being memory_order_seq_cst
, isn't this just as expensive?
Question: Can concurrent a program using locks be as fast as concurrent lock-free program?
If so, it may not be worth the effort unless I want to use memory_order_acq_rel
for atomics.
Edit: I may be missing something but lock-based cant be faster than lock-free because each lock will have to be a full memory barrier too. But with lock-free, it's possible to use techniques that are less restrictive then memory barriers.
So back to my question, is lock-free any faster than lock based in new C++11 standard with default memory_model
?
Is "lock-free >= lock-based when measured in performance" true? Let's assume 2 hardware threads.
Edit 2: My question is not about progress guarantees, and maybe I'm using "lock-free" out of context.
Basically when you have 2 threads with shared memory, and the only guarantee you need is that if one thread is writing then the other thread can't read or write, my assumption is that a simple atomic compare_and_swap
operation would be much faster than locking a mutex.
Because if one thread never even touches the shared memory, you will end up locking and unlocking over and over for no reason but with atomic operations you only use 1 CPU cycle each time.
In regards to the comments, a spin-lock vs a mutex-lock is very different when there is very little contention.
time(Y)/time(X)
is always great: in some cases both can be slow and the ration would be low, in other cases X will be trivial and the ration would be extremely high. That's what was meant by "hypothesis". (I did not insinuate that some set of hypotheses would make X slower than Y.) – Dunlap