【问题标题】:Can I call CloseHandle() immediately after _beginthreadex() succeeded?_beginthreadex() 成功后我可以立即调用 CloseHandle() 吗?
【发布时间】:2012-01-04 17:12:19
【问题描述】:

我对使用从_beginthreadex() 返回的句柄不感兴趣。立即致电CloseHandle() 是否安全?

我认为必须这样做以避免内存泄漏。

【问题讨论】:

  • 您最终需要关闭句柄以避免资源泄漏,但在启动线程后立即执行此操作会使您无法使用句柄同步(等待)线程完成。是的,它是安全的。
  • 即使立即关闭_beginthreadex返回的句柄,还有另一种方法可以与线程同步。线程本身可以通过 GetCurrentThreadId 访问其线程 id 并将其传递给主线程。然后,您可以随时调用 OpenThread(具有 SYNCHRONIZE 权限)以从该线程 id 获取新句柄。

标签: c++ windows multithreading visual-c++ beginthreadex


【解决方案1】:

是的,您可以在决定不再需要该句柄后立即关闭该句柄。这不会影响线程执行。但是,您可能应该在继续之前检查线程是否已经启动。

您担心的泄漏不是内存泄漏,而是系统资源泄漏——通常情况更糟。

【讨论】:

  • 谢谢。确定新创建的线程是否已实际启动的最佳方法是什么?
  • @user1061590:没有“最佳”方式,但我认为您应该检查_beginthreadex() 返回的值以确保它成功。
【解决方案2】:

根据 MSDN,您不应该关闭 __beginThreadEx 返回的句柄: _endthread 自动关闭线程句柄(而 _endthreadex 不会)。因此,在使用 _beginthread 和 _endthread 时,不要通过调用 Win32 CloseHandle API 显式关闭线程句柄。 (详情请参阅http://msdn.microsoft.com/en-us/library/kdzttdcb(ar-sa).aspx。)

【讨论】:

  • 那部分谈到了不同的功能。 "当使用 _beginthread 和 _endthread 时,不要显式关闭线程句柄` vs. "_beginthreadex 返回的句柄必须由 _beginthreadex 的调用者关闭"。跨度>
猜你喜欢
  • 1970-01-01
  • 2021-12-26
  • 2021-06-26
  • 1970-01-01
  • 2013-02-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-21
相关资源
最近更新 更多