多线程学习一 可见性、原子性和有序性

可见性

在单核时代,所有的缓存都操作同一个cup上的缓存,所以可见性很容易解决。当a线程更新了缓存上的变量,那么在b线程去访问该变量的时候,拿到的一定是最新值。

在多核时代,每个cup都有自己的缓存区,当不同cup上的线程去访问内存中的同个变量时,假设该变量在cup中都有缓存。那么不同cup上的线程对变量的修改不会立马同步到内存中,导致不同cup的缓存中的同一个变量对另外cup没有可见性,这个就属于硬件程序员给软件程序员挖的“坑。

原子性

操作系统允许某个进程执行一小段时间,例如 50 毫秒,过50毫秒就会执行其他任务,这个过程叫任务切换,50毫秒我们就叫时间片。

原子性我们指的是把一个操作或者多个操作在cup上的执行不被中断,我们称为原子性。cup能保证的原子性,是cup上的指令,而不是高级语言指令。

有序性

编译器为了优化执行效率,会在不改变程序结果的前提下优化程序执行指令。

一般情况下不会有问题,但是在有些问题下,会导致一些难预见的问题。

课后笔记:32位的操作系统执行long类型的操作时,因为long类型超过了32位的单个空间,所以对long类型的操作是分成多次操作的,这些导致一些原子性的问题。

发布了23 篇原创文章 · 获赞 19 · 访问量 1421

猜你喜欢

转载自blog.csdn.net/u012335601/article/details/88630906