试着用线程池。开启了4个同样的工作线程。完成一个任务后,SuspendThread起来,更换参数,然后resumethread该线程。另有一个线程用waitformultipleobjects负责检测上面4个工作线程中的空闲线程。
问题出现:第2个线程完成了一个文件A的处理,SuspendThread起来,更换参数文件E,然后resumethread该线程。那么4个线程就继续工作了。在没有完成文件处理之前,我认为waitformultipleobjects应该等待,不会返回线程,但是waitformultipleobjects 不停地返回第2个线程,resumethread第2个线程后,难道必须设置一下什么?请教原因何在,该如何解决?

解决方案 »

  1.   

    SuspendThread返回-1,失败。错误码是:5,拒绝访问。
      

  2.   

    http://www.newsmth.net/nForum/#!article/VisualC/263881?p=1If the thread is making a kernel call, SuspendThread fails. An application might need to repeat the SuspendThread several times for it to succeed. 
    意思是说如果子线程正在进行内核调用,SuspendThread调用会失败。这是说SuspendThread是异步函数么? 
    网上找到一句话: 
    SuspendThread与内核方式的执行是异步进行的,但是在线程恢复运行之前,不会发生用户方式的执行。调用SuspendThread时必须小心,因为不知道暂停线程运行时它在进行什么操作。只有确切知道目标线程是什么(或者目标线程正在做什么),并且采取强有力的措施来避免因暂停线程的运行而带来的问题或死锁状态,SuspendThread才是安全的。 
      

  3.   

    你可以使用EVENT事件对象来同步就好了,最好不要用SuspendThread/ResumeThread()
      

  4.   


    我有点疑问就是:一个任务完成,我的程序中就是线程处理完一个txt文件后,用EVENT事件 阻塞 线程之后,要求处理另一个txt文件,即更换参数,此时释放EVENT事件,那么线程是否会以新参数运行?
      

  5.   

    http://topic.csdn.net/u/20091231/15/62aead9b-4f51-4094-a20f-2b441b8239dd.html
    WaitForSingleObject+Event 控制流程更灵活...
      

  6.   

    改用生产者消费者模型比较适合
    建立工作线程和工作队列另外不要用SuspendThread,会引发很多问题,如死锁
      

  7.   

    听各位忠告,不用SuspendThread。
    还是用原来的老办法,但把while+sleep等待,改为:WaitForSingleObject+Event