我应该使用 ExitThread() 还是从 C++ 中的线程返回
Posted
技术标签:
【中文标题】我应该使用 ExitThread() 还是从 C++ 中的线程返回【英文标题】:Should I use ExitThread() or Return from threads in C++ 【发布时间】:2021-11-01 16:33:42 【问题描述】:我正在开发一个服务器应用程序,多个客户端将连接到该应用程序。对于每个新客户端,我都会创建一个新线程,并希望在客户端断开连接后释放每个客户端的所有资源。
我的主线程不需要来自客户端的返回值,所以我只想安全地终止线程并释放线程使用的资源。
在这种情况下我应该使用什么以及为什么?
【问题讨论】:
您应该使用return
,以便 C++ 库可以调用所有适当的析构函数。
你是如何创建线程的?
@RichardCritten 线程的创建方式没有任何区别。如果堆栈上有对象,只有在 C++ 知道退出时它们才会被销毁。
@user207421 有时启动线程和完成线程 API 调用需要匹配(显然特定于平台)。
ExitThread
不是标准 C++ 的一部分。如果您正在编写可移植代码(您应该这样做),请使用 return
。
【参考方案1】:
这是否回答了您的问题?有时阅读参考资料非常有用:
ExitThread
备注
ExitThread 是在 C 代码中退出线程的首选方法。但是,在 C++ 代码中,线程在调用任何析构函数或执行任何其他自动清理之前退出。因此,在 C++ 代码中,您应该从您的线程函数中返回。
【讨论】:
VG 但我很好奇为什么ExitThread()
在 C 语言中是首选。
@user207421 一个好问题,我能想到的唯一原因是从线程启动函数之外的任何函数中“终止”线程,其中返回只会从该特定函数返回而不是而不是终止线程。
感谢 Erdal,我实际上已经阅读了参考资料,但不确定是否应该使用 return,因为我不需要从线程返回一些东西。
@user260854 ExitThread
允许从线程返回失败退出代码。所以它对于异常回报很有用。从线程函数返回总是返回退出代码 0。
关于 ExitThread
是 C 中的首选方法的引用有点误导,因为它与以下信息相矛盾,该信息也在您链接到的页面上:“可执行文件中的线程是链接到静态 C 运行时库 (CRT) 的线程应使用 _beginthread 和 _endthread 进行线程管理,而不是 CreateThread 和 ExitThread。如果不这样做会导致线程调用 ExitThread 时出现少量内存泄漏。"以上是关于我应该使用 ExitThread() 还是从 C++ 中的线程返回的主要内容,如果未能解决你的问题,请参考以下文章
CWinThread类,使用后要不要使用CloseHandle释放内核
c#中退出WinForm程序包括有很多方法,如:this.Close(); Application.Exit();Application.ExitThread(); System.Environmen