windows核心编程下的旋转锁
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个问题,望大神解答
------解决方案--------------------
LeaveCriticalSection 检查计数器,如果>0,则表示调用LeaveCriticalSection的线程还在占用着共享资源,至少占用1次,也可能是2,3次,也就是说资源还在当前线程控制下,就什么都不做,这里说的什么都不做是指:不交出资源的使用权。LeaveCriticalSection直接返回,继续他下面的代码。
设置旋转锁的时间估计与当前进程中各线程的执行时长,用户模式到内核模式切换时间有关,我个人的理解,这个函数在单CPU上没什么用,在多CPU上优化的复杂度要比它节省的一点切换时间来得更麻烦。
以上仅是小弟的一点个人理解,希望你可以参考下。
第五版:
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个问题,望大神解答
------解决方案--------------------
LeaveCriticalSection 检查计数器,如果>0,则表示调用LeaveCriticalSection的线程还在占用着共享资源,至少占用1次,也可能是2,3次,也就是说资源还在当前线程控制下,就什么都不做,这里说的什么都不做是指:不交出资源的使用权。LeaveCriticalSection直接返回,继续他下面的代码。
设置旋转锁的时间估计与当前进程中各线程的执行时长,用户模式到内核模式切换时间有关,我个人的理解,这个函数在单CPU上没什么用,在多CPU上优化的复杂度要比它节省的一点切换时间来得更麻烦。
以上仅是小弟的一点个人理解,希望你可以参考下。