Sleep多久才合理?

hztj2005 2011-09-26 09:15:41
我用多线程分词之后,统计含某个词语的语句。

我有一个主线程分配任务,又启动了4个线程分词。

我在分词线程用了一个while(1),一直在后台运行,为了避免占用cpu,

因为分词工作是间断需要,

有时10分钟都不会有分词任务,

有时瞬间可能有几十个语句需要快速分词

当没有任务是,设了Sleep(1000)。

但是线程一旦Sleep休眠,需要分词时,平均等待时间是1000/2。

如果Sleep(n),n太小,没有分词任务时,又可能占用许多cpu。

我用的是 Windows sever 2003.

n多大才合理?
...全文
342 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
hxfjb 2011-09-29
  • 打赏
  • 举报
回复
如果仅仅是怕占用cpu太多,你基本上不用操心Sleep的时间。
建议你这样写:
Sleep(10); //其实和Sleep(1)区别不大,只要有Sleep,就不会导致CPU占用率太高
smwhotjay 2011-09-29
  • 打赏
  • 举报
回复
ysok7878 2011-09-29
  • 打赏
  • 举报
回复 1

[Quote=引用 6 楼 jackson35296 的回复:]
不要用Sleep(),用WaitForSingleObject(hEvent),没有任务时,把事件设置为无信号状态,当有任务时,把事件设置为有信号状态
[/Quote]
正解,最好不要用全局变量
hztj2005 2011-09-27
  • 打赏
  • 举报
回复
我还没有用WaitForSingleObject(hEvent)。

我用Sleep(1000),gettickcount输出跟踪,等待时间经常是700ms.

我调整为Sleep(120),等待时间经常是30ms.

由于gettickcount计时精度不够,30ms不是准确数字。

但肯定Sleep(1000),会浪费很多时间。





sparrow429 2011-09-27
  • 打赏
  • 举报
回复
用sleep不好,用事件好
lijianli9 2011-09-26
  • 打赏
  • 举报
回复
最好用事件来触发,这些不会占用用户态的cpu时间。等事件有效就唤醒处理线程执行,然后再将事件重置为无信号状态。
jackson35296 2011-09-26
  • 打赏
  • 举报
回复
不要用Sleep(),用WaitForSingleObject(hEvent),没有任务时,把事件设置为无信号状态,当有任务时,把事件设置为有信号状态
用户 昵称 2011-09-26
  • 打赏
  • 举报
回复
弄个全局变量,最大为1000,可动态修改。
  • 打赏
  • 举报
回复
回帖拿分
zgl7903 2011-09-26
  • 打赏
  • 举报
回复
WaitForMultipleObjects 或 WaitForMultipleObjectsEx
一个线程退出事件 一个唤醒线程事件
许文君 2011-09-26
  • 打赏
  • 举报
回复
你不能关闭线程么?当有事件时在动态去创建
ndy_w 2011-09-26
  • 打赏
  • 举报
回复
不要用Sleep,用wait。主线程设置任务后唤醒
v_table 2011-09-26
  • 打赏
  • 举报
回复
这样根本没个准,可以借鉴IOCP的原理
buyong 2011-09-26
  • 打赏
  • 举报
回复
这个需求如果用数据库的全文检索技术其实不错。比如Oracle的全文检索技术,我觉得性能和准确性都不错。
[Quote=引用楼主 hztj2005 的回复:]
我用多线程分词之后,统计含某个词语的语句。

我有一个主线程分配任务,又启动了4个线程分词。

我在分词线程用了一个while(1),一直在后台运行,为了避免占用cpu,

因为分词工作是间断需要,

有时10分钟都不会有分词任务,

有时瞬间可能有几十个语句需要快速分词

当没有任务是,设了Sleep(1000)。

但是线程一旦Sleep休眠,需要分词时,平均等待时……
[/Quote]

15,471

社区成员

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

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