worker thread的问题

benh 2005-12-18 04:15:34
背景:
系统有若干数据流,针对每一个数据流,每隔一定时间间隔(比如1 sec)去读取对应的统计数据,于是在每个数据流开始的时候,建立一个新的worker thread,来完成计时并且读取数据的工作。
worker thread的control function里面,用了一个while循环。判断条件是数据流对应的m_bExit是否为真。退出时,在control function外面的线程中将该数据流对应的m_bExit置为1,于是这个worker thread退出。
问题:
1. 这里,每隔一定时间间隔去读取数据,用sleep实现时间间隔,是否效率低下?sleep时候是否线程仍然占资源呢?如果是,有什么更好的办法吗?
2. 线程退出的问题。由另外线程来决定本worker thread线程的退出,直接用m_bExit是否可行?msdn里面提到,premature退出,如果是在另外的线程调用AfxEndThread 的话,就要注意线程间通信。这个线程间通信指什么? 我直接修改m_bExit会有什么问题吗?
谢谢。
...全文
155 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
gohappy_1999 2005-12-19
  • 打赏
  • 举报
回复
还是别用SLEEP了。比较难控制
不等sleep完成就退出,除非强行干掉这个线程,否则是不行的。最好用Waitforsingleobject...这些函数
benh 2005-12-19
  • 打赏
  • 举报
回复
谢谢大家。
线程退出,将某个数据流对应的m_bExit在线程之外置为TRUE,worker线程的控制函数的while循环将跳出,并结束。这里有个问题,我想在外面修改m_bExit之后,让worker线程立刻退出,而不必等worker thread中的sleep完成才退出。该怎么办呢?
如果用CEvent,在已经sleep的情况下,是没有办法立即知道event.signal的吧?
因为每次sleep时间很长,如果在网络连接断开的话,想把所有的worker thread都断掉,这样每个数据流都要保证sleep时间之后才读m_bExit,这样时间将比较长。有没有什么合适的办法?
freemme 2005-12-18
  • 打赏
  • 举报
回复
sleep可以用

建议不要用AfxEndThread结束线程,这样可能会有系统资源没有被释放;可以用你的方式,但是需要注意同步,也可以用事件通知方式
tanq 2005-12-18
  • 打赏
  • 举报
回复
sleep 在系统CPU资源被大量占用的情况下,到底SLEEP了多少时间谁也不知道,最好不要用
cnwolf 2005-12-18
  • 打赏
  • 举报
回复
1.如果对时间要求不严格的话,个人觉得sleep是可以的,sleep的时候线程是不参加cpu分配的,cpu资源不用占用,别的资源还是会占用的。

2.m_bExit被主控线程和工作线程共享,多线程共享数据如果不加互斥访问的话,可能出现的问题是1同时修改m_bExit,导致修改出错2读m_bExit时会不是最新的结果。从你的应用环境来看,你的主控线程修改m_bExit,而你的工作线程读m_bExit,只会有第二中问题,而这个问题,不会影响你的程序。线程退出是不要使用AfxEndThread ,它是强行的取消线程,会存在一些资源的释放和线程使用的库。

还有如果你要统计数据流的话,最好使用select检测数据流,存在数据的时候立即读取。如果你用sleep,假设你在sleep期间另一端一直在不停的发送大数据,可能会把数据流堵塞。

15,471

社区成员

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

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