【问题标题】:Who's responsibility is it to call CloseHandle() for Thread handle谁负责为线程句柄调用 CloseHandle()
【发布时间】:2013-12-13 18:53:33
【问题描述】:

我有一个类Class,其中有一个线程的成员属性HANDLE handle(我们可以假设它当时设置为NULL)。在某些时候,Class 中的一个方法通过CreateThread() 调度它自己的一个方法Class::threaded()(使用类本身外部的另一个函数,但在这里并不重要)。然后,调用线程可能会继续执行Class 之外的其他功能。

由于必须为从 CreateThread() 返回的 HANDLE 调用 CloseHandle(),所以我想知道在它返回之前从 Class::threaded() 调用它是否是一个不错的解决方案。

【问题讨论】:

  • 由于您已将其标记为 C++,因此您应该使用 _beginthread_beginthreadex。请参阅CreateThread 文档:“调用 C 运行时库 (CRT) 的可执行文件中的线程应使用 _beginthreadex 和 _endthreadex 函数进行线程管理,而不是 CreateThread 和 ExitThread;”
  • 这是上个世纪的建议。 CRT 已经过调整来处理这个问题,它需要支持线程池线程,当然你永远不能调用 _beginthreadex。它现在可以在需要时动态分配线程本地数据。

标签: c++ multithreading winapi window-handles


【解决方案1】:

您会收到线程的句柄,以便管理它。如果不需要,可以马上拨打CloseHandle

关闭HANDLE 不会终止线程,因此,如果您对线程中的任何内容都没有兴趣,则关闭它是安全的。

【讨论】:

  • 线程HANDLE 也经常用于同步,而不仅仅是管理。您可能要补充一点,关闭HANDLE 不会终止线程。
【解决方案2】:

您可以在使用完后立即关闭它。关闭它对线程没有影响。 (句柄由操作系统引用计数。)

【讨论】:

    【解决方案3】:

    处理线程的两种基本方法。通常您对线程终止时感兴趣,您需要保留句柄以便找出答案。当然,您会在检测到终止后将其关闭。或者你不关心,即发即弃的风格,或者有额外的同步对象来表示线程函数已完成和/或你要求它退出。在这种情况下,您只需在启动后立即关闭句柄。

    请记住, 没有必要保持打开句柄以保持线程运行,以防这是造成混乱的根源。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-05-19
      相关资源
      最近更新 更多