什么是原子操作?
一个不可被中断的操作,即一个操作在执行过程中不会被其他线程干扰或中断,保证了对共享变量在多线程环境下的一致性。
作用:用来实现并发编程中的同步机制,避免出现竞态条件。
单核处理器中断实现原子操作:一个线程是运行在核心里面的,双核四核心能运行四个线程,线程运行在核心。线程运行的代码在内存,单处理器单核要保证原子操作,只需要在开始执行一套指令(一条C++语句可能被编译成多个指令实现)时,关闭中断,指令执行完再打开中断即可。
写回策略:处理器运算出的变量,先查看缓存中是否存在,有就直接写缓存,并标记该数据为脏数据(还没有写到内存中的数据),不写到内存;如果缓存中没有,就定位一个缓存块(cache line),如果缓存块这个位置的数据是脏数据(内存没有缓存有),把脏数据写回内存,把运算结果写到缓存。
缓存失效(cache miss)和一致性问题?
答:缓存失效是因为共享变量被其他核心更新,那么此时缓存中的值就为无效;因为写回策略,新的值并没有更新到内存中出现缓存一致性问题。
两种方式实现缓存一致性:
-
总线加锁:当一个核心需要修改共享变量,则对总线发起加锁请求
-
总线嗅探:当某个核心修改缓存数据后,会给其他关注改数据的缓存通