在并发环境下,如何对资源进行保护,防止多个线程同时操作一个变量?
我们假定有两个线程来分别从银行卡和存折进行取款操作,当A线程执行完判断语句后,获得了当前账户中的余额数(1000元),因为余额大于取款金额,所以准备执行取钱操作(从账户中减去1000元),但此时它被线程B打断,然后,线程B根据余额(1000),从中取出1000元,然后,将账户里面的余额减去1000元,然后,返回执行线程A的动作,这个线程将从上次中断的地方开始执行:也就是说,它将不再判断账户中的余额,而是直接将上次中断之前获得的余额减去1000。此时,经过两次的取款操作,账户中的余额为100元,从账面上来看,银行支出了1000元,但实际上,银行支出了2000元。
可以看到并发里的一个基本问题:我们希望原子式执行这串动作,但是由于单处理器上的中断或者多个线程在多处理器上并发执行,导致我们做不到,因此引入了锁,用于临界区资源。
锁其实是个变量,我们要声明某种类型的锁变量,如自旋锁、互斥锁,这个锁变量保存了锁在某个时刻的状态。它只有2种状态,要么是可用的,表示没有线程持有该锁;要么是被占用的,表示有一个线程持有锁,正处于临界区。
锁为程序员提供了最小程度的调度控制。进程是由操作系统调度器调度的,而锁则在一定程度上让程序员获得了一些控制权,通过给临界区加锁,可以保证临界区内只有一个线程活跃。
号主:一枚机械专业本科生,经历了转行,从外包逆袭到芯片原厂的Linux驱动开发工程师,深入操作系统的世界,贯彻终身学习、终身成长的理念。平时喜欢折腾,寒冬之下,抱团取暖,期待你来一起探讨技术、搞自媒体副业,程序员接单和投资理财。【对了,不定期送闲置开发板、书籍、键盘等等】。
如果你想了解我的转行经验,欢迎找我交流~gongzhong号【哆哆jarvis】
一起不断探索自我、走出迷茫、找到热爱,希望和你成为朋友,一起成长~