【问题标题】:When windows releases threads?windows什么时候释放线程?
【发布时间】:2013-04-19 23:11:19
【问题描述】:

我们的产品会消耗大量的windows资源,比如socket句柄、内存、线程等等。通常有 700-900 个活动线程,但在某些情况下产品可以快速创建新线程并做一些工作,然后关闭它。 我遇到了我们产品的崩溃内存转储。使用 ~* windbg 命令我可以看到 817 个活动线程,但是当我运行 !handle 命令时,它会打印出以下摘要:

类型计数 无 15 事件 2603 第 13 条 文件 705 目录 4 突变体 32 窗口站 2 信号量 789 钥匙 208 过程 1 线程 5766 桌面 1 IO完成308 定时器 276 键控事件 1 TpWorkerFactory 48

所以,实际上进程拥有 5766 个线程。那么,我的问题是,Windows 何时真正释放进程的句柄?是否有可能出现某种延迟或兑现?有人可以解释这种行为吗? 我不认为我们有处理泄漏,但我们在系统的遗留部分有奇怪的行为,为小任务快速创建和关闭线程。另外我想指出,我们不太可能同时运行超过 1000 个线程,我对此非常确定。 谢谢。

【问题讨论】:

    标签: windows debugging resources windbg


    【解决方案1】:

    当您说So, actually process holds 5766 threads. 时,您真正的意思是该进程拥有5766 个线程句柄

    即使线程可能不再运行,无论是调用ExitThread()/TerminateThread() 还是从ThreadProc 返回的结果,该线程的任何句柄都将保持有效。这样就可以在已完成工作的线程的句柄上调用GetExitCodeThread()

    不幸的是,这意味着您必须remember to call CloseHandle() 而不是让它泄漏。 Creating Threads 上的 MSDN 示例在一定程度上涵盖了这一点。

    我要注意的另一件事是,在不超过 1000 个运行线程的地方,您可能会将exhaust the amount of virtual address space available 分配给 32 位进程,因为默认情况下每个线程都会为其堆栈保留 1MB 的地址空间。

    【讨论】:

    • 实际上我们使用 boost::thread::join() 来等待线程停止。我必须检查关于调用 CloseHandle() 的 boost 线程库。我知道默认堆栈大小,我们将此值覆盖为我们产品的 256k。不过还是谢谢你。
    猜你喜欢
    • 2013-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多