并发编程需要解决的三大问题:互斥、同步和分工。
为了解决CPU-内存两者速度不一致的问题,引入了CPU缓存。如果是单核CPU,线程A操作了某个数据后,更新到CPU缓存,线程B能拿到最新的数据,但是当引入多核CPU后,就会出现多个CPU之间数据可见性的问题【1】。
当操作系统引入分时调度后,在某个线程操作执行到一半时,该线程的时间片结束,另外一个线程恰好操作同一份数据,可能就会出现数据不一致的问题。
为了加速程序的执行速度,汇编代码有时候会对指令进行重排序,指令重排序对当前线程的结果没有影响,但是可能会导致其它线程得到非预期的结果。