线程开销的问题

奶糖人五号 2008-12-05 12:23:19
请问

1 如果使用waitforxxxx 这类的函数让线程阻塞,那么线程是否还会消耗CPU时间?

2 为什么一个空循环能让CPU使用率暴增,而里面加上些IO操作及waitforxxx函数 代码,就几乎不占什么时间了呢?按理说 那些代码操作都是在消耗CPU时间啊


一直没搞清楚,线程在 sleep,挂起,阻塞 三种状态下的 开销情况。
...全文
202 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xdkui 2008-12-05
  • 打赏
  • 举报
回复
1. 不会, 系统会去调度别的线程. 只有wait的事件到达后才会调度这个线程, 所以这个线程不耗CPU
2. 空循环没有让出CPU, 一直占用CPU。 加上IO后,IO一般处于等待状态,系统也会调度别的线程。所以这个线程也不耗CPU时间

关键是你的线程在wait的时候,你看着时间长,但你的线程没有被执行,所以是别的线程在用CPU
ilovedrv 2008-12-05
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 lx6636 的回复:]
楼上说的 同步函数是指啥? WaitForXXXX不是同步函数??
[/Quote]

主要是那种I/O访问之类,比如网络数据同步接收,只有等到数据才从函数中出来

cnzdgs 2008-12-05
  • 打赏
  • 举报
回复
线程处于休眠和等待状态时不占用CPU时间,执行I/O操作几乎都需要等待,所以CPU占用率较低。
奶糖人五号 2008-12-05
  • 打赏
  • 举报
回复
楼上说的 同步函数是指啥? WaitForXXXX不是同步函数??
ilovedrv 2008-12-05
  • 打赏
  • 举报
回复
1. 不占

2. 空循环? 空循环也有条件判断

sleep是暂时释放cpu,交由系统进行线程调度,平衡一下系统时间

挂起,是让线程不参与系统线程调度,没有开销

阻塞,如果是Wait之类,和挂起效果一样,但如果调用了一个同步函数,基本上会导致线程占用大量的时间片
yaozhu88 2008-12-05
  • 打赏
  • 举报
回复
学习

15,466

社区成员

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

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