【发布时间】:2014-03-10 05:34:05
【问题描述】:
使用 Afxbeginthread 有什么缺点吗?我们什么时候应该使用 AfxBeginThread,什么时候应该使用 CreateThread API。
【问题讨论】:
标签: c++ multithreading mfc
使用 Afxbeginthread 有什么缺点吗?我们什么时候应该使用 AfxBeginThread,什么时候应该使用 CreateThread API。
【问题讨论】:
标签: c++ multithreading mfc
对于 MFC 程序,请使用 AfxBeginThread。
CreateThread 是原始 Win32。它与部分标准库不兼容。
_beginthread 是 C 标准库的一部分。它添加了额外的代码来处理标准库的其他部分的线程安全,如果您改用CreateThread,这些部分将不安全。
AfxBeginThread (显然)是 MFC 的一部分。除了_beginthread 支持的线程安全之外,它还增加了一些(如果只有少数)C++ 细节。
因此,如果您的程序的其余部分也是纯的、原始的 Win32,不使用标准库或 MFC,则您应该只使用 CreateThread。如果您使用的是 MFC,通常应该使用 AfxBeginThread 而不是 CreateThread。
【讨论】:
AtlCreateThread 用于 ATL 项目,可惜它没有记录(内部包装 _beginthreadex)。
如果您使用 CRT 或 MFC 库的一部分,我永远不会使用 CreateThread/CreateThread。
使用 AfxBeginThread 或 _beginthread 或 _beginthreadex 都没有关系。 这只是口味问题。我更喜欢 AfxBeginThread,因为我经常喜欢带有 InitInstance、ExitInstance 等的 CWinThread 结构。而且因为它的论点更少;)
主要原因是 CRT 为每个线程分配了一个静态存储,如果您只是返回使用 CreatedThread 创建的线程函数,则可能无法释放该静态存储。即使使用 ExitThread 也可能导致泄漏。
这是一篇旧的知识库文章,原因如下: http://support.microsoft.com/kb/104641/en-us
您也可以在 Jeffrey Richter “Advanced Windows” 3rd Edition 中阅读相关内容 第 4 章,“进程、线程和 C 运行时库”第 108 页
或在 CreateThread 文档中:http://msdn2.microsoft.com/En-US/library/ms682453.aspx
可执行文件中调用 C 运行时库 (CRT) 的线程 应该对线程使用 _beginthreadex 和 _endthreadex 函数 管理而不是 CreateThread 和 ExitThread;这需要 使用 CRT 的多线程版本。如果创建了一个线程 使用 CreateThread 调用 CRT,CRT 可能会终止进程 内存不足的情况。
在 ExitThread 文档中:http://msdn2.microsoft.com/en-us/library/ms682659.aspx
链接到静态 C 运行时的可执行文件中的线程 库 (CRT) 应该使用 _beginthread 和 _endthread 作为线程 管理而不是 CreateThread 和 ExitThread。不这样做 当线程调用 ExitThread 时会导致少量内存泄漏。 另一种解决方法是将可执行文件链接到 DLL 中的 CRT 而不是静态 CRT。请注意,此内存泄漏仅发生在 如果 DLL 链接到静态 CRT 并且线程调用 DLL,则为 DLL DisableThreadLibraryCalls 函数。否则,调用是安全的 CreateThread 和 ExitThread 从 DLL 中链接到 静态 CRT。
【讨论】: