Afxbeginthread和CreateThread之间的差异
Difference between Afxbeginthread and CreateThread
使用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。
- C++中std::resize(n)和std::shrink_to_fit之间的区别
- int(c) 和 c-'0' 之间的区别。C++
- 在cuda线程之间共享大量常量数据
- 在c代码之间共享数据的最佳方式
- Mix_Init和Mix_OpenAudio SDL之间的区别是什么
- C++ 使用 assign 函数的字符串与直接使用 '=' 更改值的字符串之间的区别
- VSOMEIP-2个设备之间的通信(TCP/UDP)不工作
- std::atomic和std::condition_variable wait,notify_*方法之间的区别
- 大小相等但成员数量不同的结构之间的性能差异
- 类与私有变量的其他类之间的线程安全性
- 如何在cpp文件之间切换窗口?在Qt中
- 线程之间的布尔停止信号
- 我是C++编程的新手,这些代码之间有什么区别,我应该使用哪一个
- 在 const 函数中通过引用和指针返回之间的区别
- 我想知道长双倍和双倍之间的区别
- 如何防止clang格式在流运算符调用之间添加换行符<<
- 在两台机器之间进行时间戳的最佳c++chrono函数是什么
- 使用.find函数在c++中查找字符和另一个字符之间的大小
- 构造函数和转换运算符之间的重载解析
- Afxbeginthread和CreateThread之间的差异