windows核心编程上的旋转锁
第五版:
page 211说道LeaveCriticalSection 检测到引用计数>1,立即返回,啥都不做!
如果==0,做2个动作;(1)更新变量,表示没有任何线程正在访问资源,我能理解,
(2)检测有没有其他线程访处于等待,如果有,立即将其转换为可调度状态。
问题1:为什们>1,啥都不做?
比如:同一个线程里,函数代码:
enter....
enter...
i++;
levae...
leave...
两次enter,增加引用计数了吧? 变成, 而Levae...则发现>1,啥都不做,难道不减少为0嘛?
我的想法和书上显然不一样,求大神解释。
问题2:page212. 用了半页纸张讲解了旋转锁。
对于单cpu,对函数InitializeCriticalSectionAndSpinCount(关键段指针,旋转锁次数);
次数设置为0,作者是这样解释的,如果一个时间内, 只有一个线程在跑,这个线程恰好是调用函数InitializeCriticalSectionAndSpinCount的那个线程,那么另一个拥有资源的线程,就不会执行,那么就不会没有机会
来释放资源。
作者说来说去,还是一句话:这个函数,对于单cpu是毫无意义的, 除非 调用 InitializeCriticalSectionAndSpinCount的线程
循环的时间很短,在这个时间内,另一个拥有资源的线程释放了资源,才有意义了,没有从用户模式切换到内核模式!
我的问题是:对于2个cpu的机子而言,那么设置多少次数合适呢?
还有这个函数是否鸡肋?
2个问题,望大神解答