windows核心编程上的旋转锁

liuzu2016 2012-09-12 09:05:21
第五版:



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个问题,望大神解答

...全文
289 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
taz911 2012-09-14
  • 打赏
  • 举报
回复
LeaveCriticalSection 检查计数器,如果>0,则表示调用LeaveCriticalSection的线程还在占用着共享资源,至少占用1次,也可能是2,3次,也就是说资源还在当前线程控制下,就什么都不做,这里说的什么都不做是指:不交出资源的使用权。LeaveCriticalSection直接返回,继续他下面的代码。

设置旋转锁的时间估计与当前进程中各线程的执行时长,用户模式到内核模式切换时间有关,我个人的理解,这个函数在单CPU上没什么用,在多CPU上优化的复杂度要比它节省的一点切换时间来得更麻烦。

以上仅是小弟的一点个人理解,希望你可以参考下。
cao_julians 2012-09-13
  • 打赏
  • 举报
回复
请原谅,我对OS层面的东西不精通,不敢妄言。
孤独小剑 2012-09-12
  • 打赏
  • 举报
回复
不懂windows哇!
帮你顶下吧!

15,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 进程/线程/DLL
社区管理员
  • 进程/线程/DLL社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧