Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/150.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Afxbeginthread和CreateThread之间的差异_C++_Multithreading_Mfc - Fatal编程技术网

C++ Afxbeginthread和CreateThread之间的差异

C++ Afxbeginthread和CreateThread之间的差异,c++,multithreading,mfc,C++,Multithreading,Mfc,使用Afxbeginthread有什么缺点吗。什么时候应该使用AfxBeginThread,什么时候应该使用CreateThread API。对于MFC程序,请使用AfxBeginThread CreateThread是原始Win32。它与标准库的某些部分不兼容 \u beginthread是C标准库的一部分。它添加了额外的代码来处理标准库的其他部分的线程安全性,如果改用CreateThread,这些部分将是不安全的 AfxBeginThread显然是MFC的一部分。随着代码的安全性,通过代码>

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

对于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
)。