Afxbeginthread和CreateThread之间的差异

Difference between Afxbeginthread and CreateThread

本文关键字:之间 CreateThread Afxbeginthread      更新时间:2023-10-16

使用Afxbeginthread有什么缺点吗。何时应该使用AfxBeginThread,何时应该使用CreateThread API。

对于MFC程序,请使用AfxBeginThread

CreateThread是原始Win32。它与标准库的某些部分不兼容。

_beginthread是C标准库的一部分。它添加了额外的代码来处理标准库的其他部分的线程安全性,如果使用CreateThread,这些部分将是不安全的。

AfxBeginThread(显然)是MFC的一部分。除了_beginthread支持的线程安全性之外,它还添加了一些(如果只是一些)C++细节。

因此,只有当程序的其余部分也是纯的、原始的Win32,不使用标准库或MFC时,才应该使用CreateThread。如果使用MFC,则通常应使用AfxBeginThread而不是CreateThread

如果使用CRT或MFC库的任何部分,我都不会使用CreateThread/CreateThread。

使用AfxBeginThread、_beginthread或_begintsreadex都无关紧要。这只是品味的问题。我更喜欢AfxBeginThread,因为我经常喜欢带有InitInstance、ExitInstance等的CWinThread结构

主要原因是CRT为每个线程分配一个静态存储,如果您只是返回用CreatedThread创建的线程函数,则可能无法释放该存储。即使使用ExitThread也可能导致泄漏。

以下是KB的一篇旧文章,原因如下:http://support.microsoft.com/kb/104641/en-us

你也可以在Jeffrey Richter"Advanced Windows"第三版中阅读到这一点第4章"进程、线程和C运行时库"第108页

或者在CreateThread Docu中:http://msdn2.microsoft.com/En-US/library/ms682453.aspx

可执行文件中调用C运行库(CRT)的线程应该为线程使用_beginthreadex和_endthreadex函数管理,而不是CreateThread和ExitThread;这需要使用CRT的多线程版本。如果创建了线程使用CreateThread调用CRT,CRT可以在中终止进程低内存条件。

在ExitThread Docu中:http://msdn2.microsoft.com/en-us/library/ms682659.aspx

链接到静态C运行时的可执行文件中的

线程库(CRT)应该使用_beginthread和_endthread作为线程管理,而不是CreateThread和ExitThread。未能这样做当线程调用ExitThread时,会导致少量内存泄漏。另一个解决方案是将可执行文件链接到DLL中的CRT而不是静态CRT。请注意,此内存泄漏仅发生在如果DLL链接到静态CRT,并且线程调用DisableThreadLibraryCalls函数。否则,打电话是安全的从链接到静态CRT。