记一次lost wake-up问题
这个问题是在测试操作系统中信号量机制对进程的控制中发现的,其实还是对多线程了解的太少了。
问题一:int idx=100000,然后我们每一个进程都idx--,是否会出现A进程取出idx=100的同时B也取出来idx=100,然后各自--再放回去,idx==99而不是idx=98?
尽管计算机计算的速度非常快,但这个问题还是会发生的!不信你试试,记得idx设的大一点。
问题二:有关操作系统中线程的切换
操作系统可以通过信号量机制的pv操作来实现锁的机制(可以忽略)。那么操作系统是怎样保证锁的安全性的呢?
1:关中断:
适用于单核,因为多核的话,即使你把中断关了,保证了该线程开关锁这一段的原子性,但是还是会有其他的处理器访问到这些资源。并且开关中断实在是太浪费时间了。
2:test-and-set( 自旋锁 ):
1:定义:是指当一个线程在获取锁的时候,如果锁已经被其它线程获取,那么该线程将循环等待,然后不断的判断锁是否能够被成功获取,直到获取到锁才会退出循环。
2:个人关于自旋锁当时的一个疑问:自旋锁不也是通过汇编语句来写的,那Test_And_Set_Lock读取lock并且执行的过程不也应该是不能保证原子性的吗?
其实不是,为啥test-and-set叫硬同步,因为Test_And_Set_Lock读取lock并且执行的过程是硬件保证了原子性,具体是怎样保证的我也不太晓得。
3: