C++ Afxbeginthread和CreateThread之间的差异
使用Afxbeginthread有什么缺点吗。什么时候应该使用AfxBeginThread,什么时候应该使用CreateThread API。对于MFC程序,请使用C++ Afxbeginthread和CreateThread之间的差异,c++,multithreading,mfc,C++,Multithreading,Mfc,使用Afxbeginthread有什么缺点吗。什么时候应该使用AfxBeginThread,什么时候应该使用CreateThread API。对于MFC程序,请使用AfxBeginThread CreateThread是原始Win32。它与标准库的某些部分不兼容 \u beginthread是C标准库的一部分。它添加了额外的代码来处理标准库的其他部分的线程安全性,如果改用CreateThread,这些部分将是不安全的 AfxBeginThread显然是MFC的一部分。随着代码的安全性,通过代码>
AfxBeginThread
CreateThread
是原始Win32。它与标准库的某些部分不兼容
\u beginthread
是C标准库的一部分。它添加了额外的代码来处理标准库的其他部分的线程安全性,如果改用CreateThread
,这些部分将是不安全的
AfxBeginThread
显然是MFC的一部分。随着代码的安全性,通过代码> > NoXixTys<代码>,它添加了一些(如果只有几个)C++的细节。
因此,只有当程序的其余部分也是纯的原始Win32时,才应该使用CreateThread,而不使用标准库或MFC。如果您使用的是MFC,则通常应使用
AfxBeginThread
而不是CreateThread
如果您使用CRT或MFC库的任何部分,我都不会使用CreateThread/CreateThread
使用AfxBeginThread或_beginthread或_beginthreadex并不重要。
这只是品味的问题。我更喜欢AfxBeginThread,因为我经常喜欢带有InitInstance、existInstance等的CWinThread结构。因为它的论点较少;)
主要原因是CRT分配了一个静态的每线程存储,如果您只返回一个使用CreatedThread创建的线程函数,则该存储可能不会被释放。即使使用ExitThread也可能导致泄漏
以下是一篇旧的知识库文章,原因如下:
你也可以在杰弗里·里克特的《高级Windows》第三版中了解到这一点
第4章,“进程、线程和C运行时库”第108ff页
或者在CreateThread文档中:
可执行文件中调用C运行时库(CRT)的线程
应该为线程使用_beginthreadex和_endthreadex函数
管理而不是CreateThread和ExitThread;这需要
使用多线程版本的CRT。如果创建了一个线程
使用CreateThread调用CRT,CRT可以在中终止进程
内存不足
在ExitThread文档中:
链接到静态C运行时的可执行文件中的线程
库(CRT)应使用_beginthread和_endthread作为线程
管理,而不是CreateThread和ExitThread。不这样做
当线程调用ExitThread时,会导致少量内存泄漏。
另一个解决方法是将可执行文件链接到DLL中的CRT
而不是静态CRT。请注意,此内存泄漏仅发生在
如果DLL链接到静态CRT且线程调用
DisableThreadLibraryCalls函数。否则,打电话是安全的
从链接到
静态阴极射线管
+
AtlCreateThread
对于ATL项目,很遗憾它没有文档化(内部包装\u beginthreadex
)。