在线程池里调用一个线程完成任务后,线程池会将线程置于空闲,等待下个任务。但是线程被调用以后,会撤销线程相关资源,无法再被调用;所以,我只能重新创建一个新线程放到线程池中。但这样效率不是很高,请问线程池是如何实现同一个线程可以反复执行任务的呢?

解决方案 »

  1.   

    http://jacky-dai.iteye.com/blog/1090285
      

  2.   

    你发的是Linux下的线程池,我想知道win32下的线程池管理。我自己写了一个线程池,具有所有线程池的功能。但是缺点就性能不是很好。我在线程池中默认创建了10个线程,有任务队列中有任务就从线程池中调用线程进行处理,处理完后线程就自动销毁了,然后我会自动创建一个新线程,确保线程池中有足够等待的空闲线程。问题:频繁的线程创建和销毁CPU开销不小。在《windows核心编程》的11章节介绍了windows自带的三种线程池方法,使用没有问题,但是未提及我遇到的这个问题是如何处理的。在10章谈论线程时,提及过线程创建运行完成后会自动销毁,不能再重新启动线程。但是在线程池中却需要线程重复执行工作任务。windows的完全端口技术,将任务放置到内核的队列中,确保线程创建的个数受限制(一般CPU个数),从而减少线程上下文切换占用的CPU开销,从而提高效率。
      

  3.   


    谁叫你销毁了,如果销毁再创建,还有线程池的必要么?
    直接看代码,可能你会好理解一点//线程函数伪代码
    DWORD tfunc(void* p)//线程函数
    {
    while(!isQuit())//是否需要退出线程
    {//线程循环
    if(TaskList.IsEmpty())//任务队列是否为空
    waitTaskList();//如果是空队列则等待队列不为空的信号(可以使用等待信号API使线程休眠)
    else
    {
    work w=TaskList.getTask();//取出任务并执行之
    dowork(w);
    }
    }
    }
    //在管理任务时,一但有新的任务加入队列就重置队列信号,处于休眠状态的线程会被唤醒。
      

  4.   

    不要让线程退出就是了撒。
    用这个控制
    WaitForMultipleObjectswhile (TRUE)
    {
    dwWaitRtn = WaitForMultipleObjects(2,hWriteHandle,FALSE,8000);
    if (dwWaitRtn == WAIT_OBJECT_0)
    {
    Task();
    }

    if (dwWaitRtn == WAIT_TIMEOUT)
    {
    //exit
    }
    }
      

  5.   

    已经搞定了,借用IOCP和迭代IO技术,效率提升很多。
      

  6.   

    已经搞定了,采用IOCP和迭代IO很好的解决了我的问题。