【问题标题】:Difference between Afxbeginthread and CreateThreadAfxbeginthread 和 CreateThread 之间的区别
【发布时间】:2014-03-10 05:34:05
【问题描述】:

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

【问题讨论】:

    标签: c++ multithreading mfc


    【解决方案1】:

    对于 MFC 程序,请使用 AfxBeginThread

    CreateThread 是原始 Win32。它与部分标准库不兼容。

    _beginthread 是 C 标准库的一部分。它添加了额外的代码来处理标准库的其他部分的线程安全,如果您改用CreateThread,这些部分将不安全。

    AfxBeginThread (显然)是 MFC 的一部分。除了_beginthread 支持的线程安全之外,它还增加了一些(如果只有少数)C++ 细节。

    因此,如果您的程序的其余部分也是纯的、原始的 Win32,不使用标准库或 MFC,则您应该只使用 CreateThread。如果您使用的是 MFC,通常应该使用 AfxBeginThread 而不是 CreateThread

    【讨论】:

    • + AtlCreateThread 用于 ATL 项目,可惜它没有记录(内部包装 _beginthreadex)。
    【解决方案2】:

    如果您使用 CRT 或 MFC 库的一部分,我永远不会使用 CreateThread/CreateThread。

    使用 AfxBeginThread 或 _beginthread 或 _beginthreadex 都没有关系。 这只是口味问题。我更喜欢 AfxBeginThread,因为我经常喜欢带有 InitInstance、ExitInstance 等的 CWinThread 结构。而且因为它的论点更少;)

    主要原因是 CRT 为每个线程分配了一个静态存储,如果您只是返回使用 CreatedThread 创建的线程函数,则可能无法释放该静态存储。即使使用 ExitThread 也可能导致泄漏。

    这是一篇旧的知识库文章,原因如下: http://support.microsoft.com/kb/104641/en-us

    您也可以在 Jeffrey Richter “Advanced Windows” 3rd Edition 中阅读相关内容 第 4 章,“进程、线程和 C 运行时库”第 108 页

    或在 CreateThread 文档中:http://msdn2.microsoft.com/En-US/library/ms682453.aspx

    可执行文件中调用 C 运行时库 (CRT) 的线程 应该对线程使用 _beginthreadex 和 _endthreadex 函数 管理而不是 CreateThread 和 ExitThread;这需要 使用 CRT 的多线程版本。如果创建了一个线程 使用 CreateThread 调用 CRT,CRT 可能会终止进程 内存不足的情况。

    在 ExitThread 文档中:http://msdn2.microsoft.com/en-us/library/ms682659.aspx

    链接到静态 C 运行时的可执行文件中的线程 库 (CRT) 应该使用 _beginthread 和 _endthread 作为线程 管理而不是 CreateThread 和 ExitThread。不这样做 当线程调用 ExitThread 时会导致少量内存泄漏。 另一种解决方法是将可执行文件链接到 DLL 中的 CRT 而不是静态 CRT。请注意,此内存泄漏仅发生在 如果 DLL 链接到静态 CRT 并且线程调用 DLL,则为 DLL DisableThreadLibraryCalls 函数。否则,调用是安全的 CreateThread 和 ExitThread 从 DLL 中链接到 静态 CRT。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-12-25
      • 2020-05-10
      • 2014-09-20
      • 2010-10-28
      • 2015-10-04
      • 2012-08-12
      • 2011-02-18
      相关资源
      最近更新 更多