【问题标题】:How to end _beginthreadex()?如何结束_beginthreadex()?
【发布时间】:2013-10-15 16:28:24
【问题描述】:

在我的桌面应用程序中,我使用 _beginthreadex(...) 创建了一个简单的线程。我想知道如果我的应用程序将被关闭(没有明确关闭线程)会发生什么?线程内的所有资源会被自动清除吗?我有疑问。 所以我喜欢在我的应用程序关闭时结束线程。我想知道最好的做法是什么? _endthreadex 只能在线程内部(!)使用,而 TerminateThread(...) 之类的东西似乎不起作用(无限循环)。你有什么建议吗?

【问题讨论】:

    标签: c++ multithreading visual-studio-2008


    【解决方案1】:

    当 main 退出时,您的其他线程将被销毁。

    最好让你的其他线程主要等待,使用它们的句柄,并向它们发送消息(也许使用事件)以指示它们退出。然后 Main 可以发出事件信号并等待其他线程完成他们正在做的事情并干净地退出。当然这需要线程定期检查事件是否需要退出。

    【讨论】:

      【解决方案2】:

      当主线程退出时,应用程序及其所有资源都会被清理干净。这将包括其他线程及其资源。

      另外,发布您为TerminateThread 提供的代码,因为它有效。

      【讨论】:

        【解决方案3】:

        最简洁的方法是向您的线程发送一条消息(或通过事件以其他方式指示)线程应该终止并允许它释放其资源并退出其入口点函数。

        【讨论】:

          【解决方案4】:

          要关闭线程,您需要使用 _beginthreadex 返回的句柄调用 CloseHandle()。

          线程是进程的一部分,因此当进程终止时,它将带走线程,操作系统将恢复两者拥有的一切的所有权,因此所有资源都将被释放。

          请记住,如果您没有预先警告线程“结束就在附近”,那么它结束时可能正在执行某些工作。如果它正在使用任何系统或外部资源,它们将被释放,但可能处于时髦状态(例如,文件可能部分写入等)。

          另见http://www.bogotobogo.com/cplusplus/multithreading_win32A.php

          注意:使用 CloseHandle() 仅适用于 _beginthreadex,而不适用于使用 _beginthread。见http://msdn.microsoft.com/en-us/library/kdzttdcb(v=vs.90).aspx

          【讨论】:

          • @MSalters 是的,当使用 _beginthread 和 _endthread 时:_endthread automatically closes the thread handle (whereas _endthreadex does not). Therefore, when using _beginthread and _endthread, do not explicitly close the thread handle by calling the Win32 CloseHandle API. This behavior differs from the Win32 ExitThread API. MSDN OP 明确表示,'_beginthreadex'。
          • 嗯,那个 MSDN 文章不一致。它列出了_beginthread_beginthreadex 不同的4 个点,需要调用CloseHandle 不在其中。幸运的是,Visual Studio 附带 CRT 源,threadex.c 确实不包含对CloseHandle 的调用。
          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-06-22
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多