标签:release you 表示 修改 过程 读取 空闲 ase ==
class Lock { acquire(val){ if(val==0){ val = 1; return false; }else{ return true } }; release(val){ val = 0; }; } let lock = new Lock(); let val =0; let checkLock = lock.acquire(val) while(checkLock){ //do nothing and wait; }; //run your code lock.release(val);
所谓的锁,本质上只是内存中的一个整形数,不同的数值表示不同的状态,比如1表示空闲状态和加锁状态。加锁时,判断锁是否空闲,如果空闲,修改为加锁状态,返回成功,如果已经上锁,返回失败,解锁时,就把锁状态修改为空闲状态。
加锁和解锁看起来都很简单,但是os是怎么保证锁操作本身的原子性呢? 在多核环境中,两个核上的代码同时申请一个锁,两个核同时读取锁变量,同时判断锁是空闲的,再各自修改锁变量为上锁状态,都返回成功,这样两个核同时获取到了锁, 这种情况可能吗? 当然是不可能的,那么os是通过什么手段来保证锁操作本身的原子性的呢?我们可以把上锁的过程具体表示为:
标签:release you 表示 修改 过程 读取 空闲 ase ==
原文地址:https://www.cnblogs.com/xinfangzhang/p/12420108.html