请问,多个线程可以读一个变量,只有一个线程可以对这个变量进行写,到底要不要加锁?

我自己的理解是,赋值操作对应两条汇编指令,所以需要加锁。不知道对不对
关注者
866
被浏览
75154

52 个回答

不光是原子性的问题。不加锁的话,其他cpu读到的可能还是cache里面的值,而不是内存中已经被修改的值。这要看你的业务逻辑里面的reader需要多快能够看到writer的修改。
我不负责任地总结一句:凡是在网上问要不要加锁的,答案一律是要加锁,没有例外。
为了避免扯皮(原子操作算不算加锁?),第一句话的“加锁”应该理解为“同步/synchronization”。其实我认为 atomic operations are dangerous,或者用 Herb Sutter 的话来说,是 Juggling Razor Blades,一般程序员老老实实用 mutex 就好了。
我知道会有很多人不同意我的观点,而且会有各路专家站出来证明某种情况下不加锁也是可行的,不必费力说服我,你们开心就好了。
为什么?