I am reading that the `volatile` keyword is not suitable for thread synchronisation and in fact it is not needed for these purposes at all.

While I understand that using this keyword is not sufficient, I fail to understand why is it completely unnecessary.

For example, assume we have two threads, thread A that only reads from a shared variable and thread B that only writes to a shared variable. Proper synchronisation by e.g. pthreads mutexes is enforced.

IIUC, without the volatile keyword, the compiler may look at the code of thread A and say: “The variable doesn’t appear to be modified here, but we have lots of reads; let’s read it only once, cache the value and optimise away all subsequent reads.” Also it may look at the code of thread B and say: “We have lots of writes to this variable here, but no reads; so, the written values are not needed and thus let’s optimise away all writes.“

Both optimisations would be incorrect. And ~~both~~ **one** would be prevented by volatile. So, I would likely come to the conclusion that while `volatile` is not enough to synchronise threads, it is still necessary for any variable shared between threads. *(note: I now read that actually it is not required for `volatile` to prevent write elisions; so I am out of ideas how to prevent such incorrect optimisations)*

I understand that I am wrong in here. But why?