使用 C++ 和 MFC 进行多线程编程
Microsoft 基础类 (MFC) 库为多线程应用程序提供支持。 本主题介绍了进程和线程以及 MFC 的多线程处理方法。
进程是应用程序的执行实例。 例如,当你双击记事本图标时,将启动运行记事本的进程。
线程是进程内的执行路径。 当你启动记事本时,操作系统将创建一个进程,并开始执行该进程的主线程。 当此线程终止时,进程也会终止。 此主线程以函数地址的形式由启动代码提供给操作系统。 通常,提供的是 main
或 WinMain
函数的地址。
如果需要,可以在应用程序中创建更多线程。 当你不想让用户等待后台或维护任务完成时,可能需要创建更多线程来处理这些任务。 MFC 应用程序中的所有线程都由 CWinThread 对象表示。 在大多数情况下,你甚至不必显式创建这些对象;而是调用框架帮助程序函数 AfxBeginThread,该函数会为你创建 CWinThread
对象。
MFC 区分两种类型的线程:用户界面线程和工作线程。 用户界面线程通常用于处理用户输入并响应用户生成的事件和消息。 工作线程通常用于完成无需用户输入的任务,例如重新计算。 Win32 API 不区分线程类型;它只需要了解线程的起始地址,以便它可以开始执行线程。 MFC 通过为用户界面中的事件提供消息泵,专门处理用户界面线程。 CWinApp
是用户界面线程对象的一个示例,因为它派生自 CWinThread
并处理用户生成的事件和消息。
应特别注意多个线程可能需要访问同一对象的情况。 多线程处理:编程提示中介绍了可用于解决这些情况下可能出现的问题的技术。 多线程处理:如何使用同步类中介绍了如何使用可用的类来同步从多个线程到单个对象的访问。
编写和调试多线程编程本质上是一项复杂而棘手的任务,因为必须确保对象不会被多个线程同时访问。 多线程主题并不教授多线程编程的基础知识,只介绍如何在多线程程序中使用 MFC。 Visual C++ 中包含的多线程 MFC 示例演示了 MFC 未包含的一些多线程添加功能和 Win32 API;但是,它们只是作为一个起点。
有关操作系统如何处理进程和线程的详细信息,请参阅 Windows SDK 中的进程和线程。
有关 MFC 多线程处理支持的详细信息,请参阅以下主题: