1.当一个共享变量可能被多个线程同时读取的时候可以用锁来做同步处理。
同步:是线程执行的时候有先后关系,比如先执行那个再执行这个,这个顺序不能颠倒,按规定的顺序执行。
异步:是执行的时候没有先后关系,比如先执行那个再执行这个,这个顺序可以颠倒,基本上谁先来谁先执行。
2.操作系统里面有两种锁保证软件的同步处理。
第一个是总线锁:在多核处理器中当一个cpu要去内存读取一个共享的变量时候,为了防止出现读到的数据有问题,可以加锁在数据总线上,即我这个cpu内核去读取该共享变量的时候其他cpu不能访问内存。
第二个是缓存锁,我们知道cache中有三级缓存,一级和二级缓存是各个cpu内核私有的,第三级缓存是所有cpu内核共享的,缓存锁锁的是第三级缓存中该变量的缓存行,这个缓存锁并不是锁住这个缓存行不让其他cpu内核访问,而是拥有该锁的cpu内核才能修改该缓存行,如果它将来被修改了,修改的cpu内核会发出一个广播事件通知其他cpu内核说这个缓存行已经被修改了,是不正确的数据,麻烦你们重新去更新这个缓存行。然后下一个拥有该锁的内核,去执行修改。保证了结果的顺序。
如果没有这个锁,每个内核执行效率可能会有一点差别,那么虽然假设A内核执行i=100并让其他内核中的缓存行无效,那么B内核执行i=300并让其他内核中的缓存无效。谁能保证是A先执行完还是B先执行完呢?最好的结果就是让A内核有锁即有这个权限,去修改该缓存行的数据,等A修改完再把这个锁的权限给B。这样保证了B读到的数据是A修改后的数据并且执行过程是顺序的。
缓存锁的详情,建议去看一下缓存一致性问题和缓存一致性协议。我说的可能不是很清楚。