Afxbeginthread和CreateThread之间的区别

时间:2014-02-12 04:28:56

标签: c++ multithreading mfc

使用Afxbeginthread是否有任何缺点。我们何时应该使用AfxBeginThread,何时应该使用CreateThread API。

2 个答案:

答案 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。