线程中有一函数需要1~20秒返回
我需要线程在3秒内结束
设计思想是:
  创建一个线程来创建子工作线程;
  用一个Timer来计时,每个子工作线程一个计时器,大于2时强制结束子工作线程现在程序创建的前2000多个子工作线程可以正常创建、工作和结束
但是2000多个以后就不能创建子工作线程了为什么?
如何解决?

解决方案 »

  1.   

    "强制结束子工作线程" 我觉得这个需要非常小心,你可以参考其他有关的讨论TerminateThread 会造成目标线程的栈, 任何来不及释放的资源,以及改变过的全局状态不能释放或恢复。此外如楼上所述,注意 CloseHandle() 不然线程内核对象不会被清除
      

  2.   

    要使用CloseHandle()来关闭“你创建的每一个线程返回的”线程句柄线程属于内核对象,线程结束的时候,其句柄是必须关闭的。否则,大量的泄漏,会造成资源资源占用过多,使以后的内核对象(比如:线程)因资源缺少而创建失败。针对你的问题,既然绝大部分是“短时间线程”,则可以这样处理。HANDLE h = CreateThread(....);
    CloseHandle(h);//创建完就关闭这个句柄,则线程结束后就没有泄漏了。
      

  3.   


    为什么非要创建、工作、结束这么多线程呢?是否可以考虑改成单个工作线程?楼上的CloseHandle应该是问题的症结所在。
      

  4.   

    谢谢,我试试看CloseHandle会把线程的堆栈清理吗?
      

  5.   

    ——————————————————————————————————
    HANDLE h = CreateThread(....);
    CloseHandle(h);//创建完就关闭这个句柄,则线程结束后就没有泄漏了。
    ——————————————————————————————————
    那我TerminateThread线程时用什么句柄啊?
      

  6.   

    现在的问题是无法TerminateThread线程,
    进程里有500~600个线程
    而事实上,最多可能有250个,多出来的是没有杀掉的
      

  7.   

    为什么非要使用TerminateThread呢?!它非常不安全的啊!其实你稍微修改一下你的代码的逻辑,是可以让每一个线程都使用return来退出的。
      

  8.   

    CloesHandle不是清除线程的堆栈,它只是减少线程内核对象的使用计数,每调用CloseHandle()一次,内核对象的使用计数减一。内核对象的使用计数为0后,系统才回释放内核对象。CreateThread(),系统会创建一个内核线程对象,并且初始使用计数为1,在CreateThread返回前系统打开内核对象,使用计数为2。因此在CreateThread()后,内核对象的使用计数为2。
    线程终结时,使用计数减一。
      

  9.   

    我调用的API函数返回需要2~20秒TO wangbab(bab):
    这么说我调用CloseHandle还可以用这个句柄来TerminateThread呀
    但是杀不掉啊
    如果在TerminateThread之后调用CloseHandle
    但是这个句柄已经不能用了
      

  10.   

    楼主创建的是ULT吧,创建一个线程只要52微秒左右,所以时间上不是问题‘CloesHandle不是清除线程的堆栈,它只是减少线程内核对象的使用计数,每调用CloseHandle()一次,内核对象的使用计数减一。内核对象的使用计数为0后,系统才回释放内核对象。’
    与临界段的处理一样么?如果建立的线程可以被强制结束的话,就不必执着于句柄了吧!
      

  11.   

    to slimsymphony(悠扬):
    >如果建立的线程可以被强制结束的话,就不必执着于句柄了吧!强制结束线程后,线程的资源怎么回收啊?
    这个是主要的问题!
      

  12.   

    你为什么要用TerminateThread
    TerminateThread后线程的资源是不会释放的。建议你让线程自己返回。
    CloseHandle()后,句柄当然没用了。