linux中的同步和互斥机制 为什么需要锁 从一个很经典的问题开始:假设有两个线程,两个线程无锁的情况下循环给一个全局变量加1,循环100次,全局变量的初始化值为0,那么最终这个全局变量的值是多少? 答案是2 ~ 200。 为什么会这样呢?我们先想一下给一个变量+1分为哪几步:从内存中将这个变量读取到寄存器中CPU通过寄存器进行+1运算将计算后的结果通过寄存器写到内存里 这三个步骤不能一条指令完成,也就是说过程中是可以被打断的,我们模拟如下过程:线程A将变量从内存读到寄存器中(此时变量值为0)线程B打断线程A,将变量增加了99次,然后将变量写回了内存(此时变量值为99)线程A继续运行,因为之前已经从内存中读过变量的值了,所以直接通过寄存器进行+1计算然后将计算的结果写回内存(此时变量值为1)线程B运行,将变量从内存读到寄存器中(此时变量值为1)线程A运行,一直运行到循环结束(此时变量值为100)线程B运行,此时线程B只剩一次循环,利用寄存器进行+1计算以后将结果写到内存里(此时变量值为2) 以上的过程是极端情况,这样我们知道了为什么最后的结果是个范围值。 数据混乱的根本原因是什么 到这我们需要停下来想一想,造成上述情况的根本原因是什么?换句话说,我们需要保证什么,变量最后的结果才能和我们的期望一样? 聪明的你一定想到了,问题出在当“读改写”流程被打断后,下次切换回来的时候当前进程并不知道这个变量有没有被别人修改过,仍然按当时自己当时读取的数据进行运算,这样就出现了问题。那么我们是不是只要保证“读改写”过程不会被打断或者在这个过程中不会有人改这个变量就可以了。 并发源 首先我们要清楚对一个变量可能的竞争来源有哪些,这里锁的使用我们以spin_lock为例,因为spin_lock是可以在中断上下文中使用的也最具代表性,而mutex_lock只能在进程上下文使用


2024最新激活全家桶教程,稳定运行到2099年,请移步至置顶文章:https://sigusoft.com/99576.html
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。 文章由激活谷谷主-小谷整理,转载请注明出处:https://sigusoft.com/29322.html