使用Afxbeginthread是否有任何缺点。我们何时应该使用AfxBeginThread,何时应该使用CreateThread API。
答案 0 :(得分:7)
对于MFC程序,请使用AfxBeginThread
。
CreateThread
是原始的Win32。它与标准库的部分不兼容。
_beginthread
是C标准库的一部分。如果您使用CreateThread
,它会添加额外的代码来处理标准库的其他部分的线程安全性。
AfxBeginThread
(明显足够)是MFC的一部分。除了_beginthread
支持的线程安全性之外,还增加了一些(如果只有少数几个)C ++细节。
因此,如果你的程序的其余部分也是纯的原始Win32,你应该只使用CreateThread,而不使用标准库或MFC。如果您正在使用MFC,则通常应使用AfxBeginThread
而不是CreateThread
。
答案 1 :(得分:4)
如果您使用CRT或MFC库的某些部分,我将永远不会使用CreateThread / CreateThread。
使用AfxBeginThread或_beginthread或_beginthreadex无关紧要。 这只是一个品味问题。我更喜欢AfxBeginThread因为我经常喜欢带有InitInstance,ExitInstance等的CWinThread结构。因为它的参数较少;)
主要原因是,如果您只返回使用CreatedThread创建的线程函数,则CRT会为每个线程存储分配一个静态存储空间。即使使用ExitThread也可能导致泄漏。
这是一篇旧知识库文章,原因如下: http://support.microsoft.com/kb/104641/en-us
您也可以在Jeffrey Richter“高级Windows”第3版中阅读此内容 第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函数。否则,可以安全地打电话 CreateThread和ExitThread从DLL中的一个线程链接到 静态CRT。