【问题标题】:MFC multithreading: AfxBeginThread vs Boost.Thread?MFC 多线程:AfxBeginThread 与 Boost.Thread?
【发布时间】:2011-10-19 18:26:04
【问题描述】:

我有一个 MFC 应用程序,我想在其中加入多线程。最初我正在考虑使用 Boost.Thread,因为使用 boost 进行开发通常很容易。但是,我想知道是否有任何陷阱,是否应该使用 AfxBeginThread 在 MFC 上下文中安全?

【问题讨论】:

  • 好吧,当然,你可能很容易在某个地方需要一个 CWinThread,并且只有一个 boost::thread。

标签: c++ multithreading mfc boost-thread


【解决方案1】:

我找到了这篇 Microsoft 文章:Multithreading: Programming Tips。它说:

从非 MFC 线程访问 MFC 对象

如果您有一个以某种方式创建线程的多线程应用程序 除了使用 CWinThread 对象,您不能访问其他 MFC 来自该线程的对象。换句话说,如果您想访问任何 来自辅助线程的 MFC 对象,您必须使用 多线程中描述的方法之一:创建 用户界面线程或多线程:创建工作线程。 这些方法是唯一允许类库 初始化处理多线程所需的内部变量 应用程序。

我打算在模型视图演示者上下文中使用线程,以便对一些长时间运行的演示者任务进行多线程处理。由于演示者需要与视图进行通信,我认为这很可能符合访问 MFC 对象的条件(至少是间接的)。基于此,我决定暂时采用 AfxBeginThread 线程创建方法。

【讨论】:

    【解决方案2】:

    尝试阅读这篇文章,在Concurrent Programming Improvements 部分,这是目前在 Windows 平台上做事的最佳方式。 Boost 会减慢您的构建速度,并包含许多您不需要的额外内容。

    还可以查看MSDN 网站上的并行编程了解更多详细信息。

    【讨论】:

      【解决方案3】:

      使用boost::thread 的一个好处是它的界面类似于std::thread 的界面。但是,有一些不同之处。如果您最终想使用std::threadboost::thread 将是一个简单的过渡。

      【讨论】:

        【解决方案4】:

        只需包含以下头文件,应该没有问题:

        #include <boost/thread/win32/mfc_thread_init.hpp>
        #include <boost/thread.hpp>
        

        【讨论】:

          【解决方案5】:

          如果你有 MFC 项目,请不要给它引入 boost。尽可能使用 MFC API。因为它有一些线程支持的东西,所以你真的不需要一个额外的库(尤其是 boost)。

          【讨论】:

            【解决方案6】:

            在我写这篇文章的时候,由于 Boost.Thread 中的这个问题,它仍然是不安全的:

            http://boost.2283326.n4.nabble.com/Fwd-Thread-Solution-to-conflict-with-MFC-td3477977.html

            (任何尝试此操作的人很快就会发现的简短版本:仅与 Boost.Thread 链接会导致 MFC 初始化中的断言)

            【讨论】:

              猜你喜欢
              • 2011-12-13
              • 1970-01-01
              • 1970-01-01
              • 2013-02-27
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-01-05
              • 1970-01-01
              相关资源
              最近更新 更多