看了一点点线程池方面的东西,有个基本的概念非常疑惑。既然用winapi和crt创建线程,都是在创建的时候去指定这个回调函数,以及回调函数的参数。那么,不管是OS的线程池还是自己实现一个线程池,都涉及到一个问题:如何给一个已经存在的线程句柄,去掉原来绑定的函数,而绑定一个新的函数上去? 靠什么api调用?还请高手解答一下原理

解决方案 »

  1.   

    可以用曲线方法
    DWORD WINAPI ThreadProc (LPVOID lpParam)
    {
        Cxxx* t = (Cxxx*)lpParam;
        while (1)
       {
        //这里看情况加锁
        pf = t->fp;
        arg = t->arg;
        // pf是函数指针,arg等一系列参数,和Thread句柄关联的(通过map或Class封装之类的,通过句柄能查到函数指针和参数)
        pf(arg, ...);
        }
    }
      

  2.   

    一般线程池都会结合 队列 来工作的
    在队列结构中增加一个 函数指针 和 参数struct que
    {
    ...
    pf; //函数指针
    arg; //参数
    }ThreadProc (LPVOID lpParam)
    {
    while(1)
    {
    //从队列取任务
    //调用任务的pf(arg, ...)
    //每个任务可以指定不同的回调函数
    }
    }