一个朋友面试被问到了锁是如何实现的,没答上来,没记错的话这应该是一个操作系统的概念。
下面简单叙述一下互斥锁的实现:
使用过信号量来进行同步的朋友都知道,信号量都是配合互斥锁来进行的,是因为信号量的p和v操作过程不是原子的,会导致程序出现意想不到的事情。
所以我们就引入了锁来保证这个过程不出问题,但是互斥锁本身也是一个数值,系统根据互斥锁的值来决定是不是继续向下执行,那么为什么锁自身的修改就能保证原子性呢:
这是依赖于硬件,硬件原子指令法:
//读者对CAS有印象吗
bool TestAndSet(bool &x){
bool rv = x;
x = true; //上锁
return rv;
//三条会代码一次执行完毕,是一个原子的过程
}
那么再来看加锁的过程:
while(TestAndSet(&lock));//不停尝试上锁,获取锁
//进入临界区执行
lock = false; //解锁走人
//.....
总结:
- 锁的实现是要依赖于硬件的,没有硬件的支持,软件层面无法设计出我们现在用的锁
- 锁的出现实际上是偶然,最初是为了测试os设计的,编程用的锁是一个副产品
- 还有其他的一些硬件指令也可以实现,如开中断和关中断(不安全,可能会导致宕机,对于多CPU机器也不通用)等原子操作