MFC 多线程:AfxBeginThread 与 Boost.Thread?

Posted

技术标签:

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

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

【问题讨论】:

好吧,当然,你可能很容易在某个地方需要一个 CWinThread,并且只有一个 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 初始化中的断言)

【讨论】:

以上是关于MFC 多线程:AfxBeginThread 与 Boost.Thread?的主要内容,如果未能解决你的问题,请参考以下文章

vc MFC 用AfxBeginThread()启动不了线程

MFC 和 AfxBeginThread 的线程调度问题

怎么在基于对话框的MFC程序中实现多线程?

猎豹MFC--进程和线程--创建线程AfxBeginThread() SetDlgItemInt()线程暂停继续终止

MFC多线程安全问题。

如何使用 AfxBeginThread创建MFC线程对象和Win32线程对象