【求助】实现线程池时,遇到一个问题,就是线程如何实现重复使用?

滴水梵音 2012-05-10 12:37:11
在线程池里调用一个线程完成任务后,线程池会将线程置于空闲,等待下个任务。但是线程被调用以后,会撤销线程相关资源,无法再被调用;所以,我只能重新创建一个新线程放到线程池中。但这样效率不是很高,请问线程池是如何实现同一个线程可以反复执行任务的呢?
...全文
340 13 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
滴水梵音 2012-05-18
  • 打赏
  • 举报
回复
已经搞定了,采用IOCP和迭代IO很好的解决了我的问题。
滴水梵音 2012-05-18
  • 打赏
  • 举报
回复
已经搞定了,借用IOCP和迭代IO技术,效率提升很多。
ls443085074 2012-05-14
  • 打赏
  • 举报
回复
不要让线程退出就是了撒。
用这个控制
WaitForMultipleObjects

while (TRUE)
{
dwWaitRtn = WaitForMultipleObjects(2,hWriteHandle,FALSE,8000);
if (dwWaitRtn == WAIT_OBJECT_0)
{
Task();
}

if (dwWaitRtn == WAIT_TIMEOUT)
{
//exit
}
}
  • 打赏
  • 举报
回复
http://jacky-dai.iteye.com/blog/1090285
滴水梵音 2012-05-11
  • 打赏
  • 举报
回复
那这么问吧,谁知道线程池中线程如何管理的?
zhouzhipen 2012-05-11
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

任务肯定是排队好的了呀,我的问题是线程调用一个任务后,线程就会被销毁,然后又要重新创建新的线程放到线程池里。

但是线程池的概念是线程完成任务后,处于空闲态,准备完成下一个任务。使用线程池的有点就是不需要频繁去创建和销毁线程,但是这个是如何实现的?
[/Quote]

谁叫你销毁了,如果销毁再创建,还有线程池的必要么?
直接看代码,可能你会好理解一点

//线程函数伪代码
DWORD tfunc(void* p)//线程函数
{
while(!isQuit())//是否需要退出线程
{//线程循环
if(TaskList.IsEmpty())//任务队列是否为空
waitTaskList();//如果是空队列则等待队列不为空的信号(可以使用等待信号API使线程休眠)
else
{
work w=TaskList.getTask();//取出任务并执行之
dowork(w);
}
}
}
//在管理任务时,一但有新的任务加入队列就重置队列信号,处于休眠状态的线程会被唤醒。
Lactoferrin 2012-05-11
  • 打赏
  • 举报
回复
我的问题是线程调用一个任务后,线程就会被销毁,谁叫你这么做的
滴水梵音 2012-05-11
  • 打赏
  • 举报
回复
任务肯定是排队好的了呀,我的问题是线程调用一个任务后,线程就会被销毁,然后又要重新创建新的线程放到线程池里。

但是线程池的概念是线程完成任务后,处于空闲态,准备完成下一个任务。使用线程池的有点就是不需要频繁去创建和销毁线程,但是这个是如何实现的?
newseacher 2012-05-11
  • 打赏
  • 举报
回复
声明一个使主线程和辅助线程 同时 可见的 变量 ,使用 关键段限制访问,修改 就好了
luo_miao 2012-05-11
  • 打赏
  • 举报
回复
线程池中的线程,初始化的时候先启动 n 个线程,都处于挂起状态,需要使用的时候唤醒,使用完成后再让其挂起,等待下一次的启动,而不是销毁。明白?
滴水梵音 2012-05-11
  • 打赏
  • 举报
回复
你发的是Linux下的线程池,我想知道win32下的线程池管理。我自己写了一个线程池,具有所有线程池的功能。但是缺点就性能不是很好。

我在线程池中默认创建了10个线程,有任务队列中有任务就从线程池中调用线程进行处理,处理完后线程就自动销毁了,然后我会自动创建一个新线程,确保线程池中有足够等待的空闲线程。

问题:频繁的线程创建和销毁CPU开销不小。

在《windows核心编程》的11章节介绍了windows自带的三种线程池方法,使用没有问题,但是未提及我遇到的这个问题是如何处理的。

在10章谈论线程时,提及过线程创建运行完成后会自动销毁,不能再重新启动线程。但是在线程池中却需要线程重复执行工作任务。windows的完全端口技术,将任务放置到内核的队列中,确保线程创建的个数受限制(一般CPU个数),从而减少线程上下文切换占用的CPU开销,从而提高效率。

Lactoferrin 2012-05-10
  • 打赏
  • 举报
回复
把任务排队,线程一个个去调用
fly4free 2012-05-10
  • 打赏
  • 举报
回复
个人想法:
你需要把资源封包。
把“包”也放到某个池里。用的时候直接分配“包关联”、初始化资源就好了。

个人觉得,关于线程对象的创建销毁,内核实现起来应该是非常快的。大部分时间片都用在了资源的申请上。

15,473

社区成员

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

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