请教多线程编程中关于CRITICAL_SECTION对象?

pc200300 2003-10-10 11:25:02
现有两个线程A和B依次先后访问该对象,当A进入时,B要阻塞。现在是否会出现这种情况:A访问结束退出后,在B访问之前A是否还有可能再次进入该对象访问?即对CRITICAL_SECTION对象是否有个访问队列的问题?谢谢大虾指点!
...全文
38 4 打赏 收藏 转发到动态 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
vcforever 2003-10-10
  • 打赏
  • 举报
回复
这种调度好象是由操作系统来完成的,我们好象无法控制!
flyelf 2003-10-10
  • 打赏
  • 举报
回复
gz...
lop5712 2003-10-10
  • 打赏
  • 举报
回复
没有队列,其内部是用一个事件来实现的(我记不到是在哪看到的啦,但这有个问题,后面说)。

当A刚LeaveCri...后,这个事件将会成信号状态(前提是必须已经有线程执行了EnterCri..),这时A挂起(不一定,但在单CPU上是),B激活,开始执行。如果有两个以上线程等待,激活规则与事件的激活规则一样了。
所以如果A离开时,B还未等待,那么A完全有可能再次在B之前进入。

前面的说法是一位老外说的,我当时有疑问。因为CRITICAL_SECTION好用不是因为只用那几个函数就行了,而是它不是内核对象,不用进入内核模式,因此不用从用户模式向内核模式转变(要花大约1000个CPU周期,老外说的),因此更快。但按照上面的说法,实际使用一个事件,那么就要切换模式了,怎能还不是内核对象?老外的说法是只有当有线程等待时,那个不好的事件才生成,并相应的进入内核模式,平时不会进行模式切换。
对上面的说法我不是很赞同,不过,如果是这样,那么大家在设计使用CRITICAL_SECTION时应该小心,不要让你的线程经常等待,不然速度和使用一个事件是一样的,得到的只有编写代码更容易。
tumin999 2003-10-10
  • 打赏
  • 举报
回复
这个对列就是由EnterCri..()函数的调用时机决定,大家按EnterCri..的顺序排队。当有一个线程释放该对象时(LeaveCri...),对列中的下一个线程进入。

15,472

社区成员

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

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