线程在等待,等待的原因是Executive,如何理解?

zencher 2009-11-16 02:44:08
有一个多线程工作的程序,多线程的性能较低,cpu占用不超过50%
用工具查看,发现线程果然大部分时间在等待,等待的原因是:Executive。
在MSDN中查了半天,对Executiv的解释是:thread is waiting for the scheduler.

线程在等待调度器?
已经确认不是sleep()和其他线程同步时使用的临界区引起的
请教高人,什么原因会导致线程的这种等待?如何解决?

真心求教~~~
...全文
674 16 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
zencher 2009-11-17
  • 打赏
  • 举报
回复
多谢大家的帮忙,大概的原因已经知道了。

比如说,一个目录下面的文件,全部读取就需要50多秒了,而全部解析只花了1分20秒左右,几乎达到磁盘读取的极限了,当开启第二个线程的时候,由于新的I/0的竞争,所以提高不大。

关于线程为Executive的等待,可以推断为磁盘驱动程序由于读取来不及而将对应的线程挂起,等待磁盘的工作,而也只有DDK级别的函数可能产生Executive类型的线程等待,这个等待是驱动程序导致的。


感谢 wangguang246 、 dirdirdir3 、 togoblime 和其他朋友们
学习了。看来有些时候不能想当然,一直不觉得磁盘速度是瓶颈,一定要测试后才知道
驱动程序也会导致线程等待的。多谢了。

结贴给分

wangk 2009-11-17
  • 打赏
  • 举报
回复
恐怕是两个线程竞争某些资源了吧,比如说两个线程同时往某一数据结构读写数据,然后用粗粒度的锁进行同步了。
  • 打赏
  • 举报
回复
学习
togoblime 2009-11-16
  • 打赏
  • 举报
回复
我理解的Wait:Executive是线程处于可调度状态,但正在等待与外部设备的同步
例如G:是你的光驱,以下代码会使线程一直处于Wait:Executive状态
	for(;;)
{
HANDLE hFile = CreateFile(L"\\\\.\\G:", GENERIC_READ,
FILE_SHARE_READ|FILE_SHARE_WRITE, NULL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

CloseHandle(hFile);
}

tcbhj 2009-11-16
  • 打赏
  • 举报
回复
在内核态解析数据
zencher 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 oyljerry 的回复:]
WaitForSingleObject 等线程同步相关的API
[/Quote]
已近确认了 WaitForSingleObject WaitForMultipleObjectS等函数引起的等待是UserRequest类型的等待

按 4楼 wangguang246 朋友的说法
可能库里面调用了kernel相关的函数导致的~~
KeWaitForSingleObject
和WaitForSingleObject
不一样,DDK 驱动 的东西
oyljerry 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 zencher 的回复:]
引用 3 楼 wangguang246 的回复:
不知道你的等待函数如何,我只是猜测你用了,
NTSTATUS
  KeWaitForSingleObject(
    IN PVOID  Object,
    IN KWAIT_REASON  WaitReason,
    IN KPROCESSOR_MODE  WaitMode,
    IN BOOLEAN  Alertable,
    IN PLARGE_INTEGER  Timeout  OPTIONAL
    );
第二个参数就是要等待的原因。也就是你上面要说的Executive


DDK里面的函数啊~~本人不熟悉这个
我的代码里面没有用这个函数,不过我用了别人的库,不知道这个库中有什么问题
能说明一下 Executive更多的细节吗?以前好像都没看到过这个相关的内容
[/Quote]
WaitForSingleObject 等线程同步相关的API
jackyren007 2009-11-16
  • 打赏
  • 举报
回复
帮楼主顶起。
zencher 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 wangguang246 的回复:]
不知道你的等待函数如何,我只是猜测你用了,
NTSTATUS
  KeWaitForSingleObject(
    IN PVOID  Object,
    IN KWAIT_REASON  WaitReason,
    IN KPROCESSOR_MODE  WaitMode,
    IN BOOLEAN  Alertable,
    IN PLARGE_INTEGER  Timeout  OPTIONAL
    );
第二个参数就是要等待的原因。也就是你上面要说的Executive
[/Quote]

DDK里面的函数啊~~本人不熟悉这个
我的代码里面没有用这个函数,不过我用了别人的库,不知道这个库中有什么问题
能说明一下 Executive更多的细节吗?以前好像都没看到过这个相关的内容
MoXiaoRab 2009-11-16
  • 打赏
  • 举报
回复
上点代码看看
oyljerry 2009-11-16
  • 打赏
  • 举报
回复
看是不是有线程占用CPU比较高,造成其他线程需要等待
zencher 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 dirdirdir3 的回复:]
文件处理是I/O处理,就是串行的(同一个硬盘的话),2个线程和一个线程提高有限是正常的.................大部分时间就是等待I/O完成................
[/Quote]
主要的不是硬盘操作,已经保证了每个线程读取的是不同的文件,而且文件都不大,一般十几K到几M不等。cpu的主要时间实在解析数据。。。

不过也谢谢你
dirdirdir3 2009-11-16
  • 打赏
  • 举报
回复
文件处理是I/O处理,就是串行的(同一个硬盘的话),2个线程和一个线程提高有限是正常的.................大部分时间就是等待I/O完成................
wangguang246 2009-11-16
  • 打赏
  • 举报
回复
不知道你的等待函数如何,我只是猜测你用了,
NTSTATUS
KeWaitForSingleObject(
IN PVOID Object,
IN KWAIT_REASON WaitReason,
IN KPROCESSOR_MODE WaitMode,
IN BOOLEAN Alertable,
IN PLARGE_INTEGER Timeout OPTIONAL
);
第二个参数就是要等待的原因。也就是你上面要说的Executive


zencher 2009-11-16
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 tr0j4n 的回复:]
有一个多线程工作的程序,多线程的性能较低,cpu占用不超过50%
=======================
恕我愚钝?第一句话就没看懂?LZ从而得出这个结论?
[/Quote]

...这个程序要处理目录下面的所有文件,开启2个线程时同只开一个线程时候比,效率的提高很低

。。。我跟踪了线程的状态,确实多数时间在等待。。
主要想明白线程等待原因为:Executive,这个该如何理解
线程可能会自己sleep而挂起,会因为内存换页而挂起,就是不知道Executive是什么情况
MoXiaoRab 2009-11-16
  • 打赏
  • 举报
回复
有一个多线程工作的程序,多线程的性能较低,cpu占用不超过50%
=======================
恕我愚钝?第一句话就没看懂?LZ从而得出这个结论?

15,473

社区成员

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

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