多线程处理:何时使用 MFC 同步类

MFC 提供的多线程类分为两类:同步对象(CSyncObjectCSemaphoreCMutexCCriticalSectionCEvent)和同步访问对象(CMultiLockCSingleLock)。

必须控制对资源的访问权限以确保资源的完整性时,使用同步类。 同步访问类用于获取对这些受控资源的访问权限。 本主题介绍何时使用各个类。

若要确定应使用的同步类,请询问以下系列问题:

  1. 应用程序是否必须等待某些事情发生,然后才能访问资源(例如,必须先从通信端口接收数据,然后才能将其写入文件)?

    如果是,请使用 CEvent

  2. 例如,同一应用程序内的多个线程是否可以同时访问此资源(例如,应用程序允许最多五个窗口查看同一文档)?

    如果是,请使用 CSemaphore

  3. 是否可以多个应用程序使用此资源(例如,该资源位于 DLL 中)?

    如果是,请使用 CMutex

    如果否,请使用 CCriticalSection

CSyncObject 从不直接使用。 它是其他四个同步类的基类。

示例 1:使用三个同步类

以维护帐户链接列表的应用程序为例。 此应用程序允许在单独的窗口中检查最多 3 个帐户,但在任何特定时间都只能更新一个帐户。 更新帐户时,更新后的数据会通过网络发送到数据存档。

此示例应用程序使用所有三种类型的同步类。 它允许一次检查最多 3 个帐户,因此它使用 CSemaphore 来限制对 3 个视图对象的访问。 尝试查看第 4 个帐户时,应用程序会等到前 3 个窗口中某个窗口关闭,否则尝试失败。 更新帐户时,应用程序使用 CCriticalSection 来确保一次只更新一个帐户。 更新成功后,它会向 CEvent 发出信号,后者会释放一个等待事件接收信号的线程。 此线程将新数据发送到数据存档。

示例 2:使用同步访问类

选择要使用的同步访问类要更简单。 如果应用程序只涉及访问单个受控资源,请使用 CSingleLock。 如果需要访问任意一个受控资源,请使用 CMultiLock。 在示例 1 中,本可以使用 CSingleLock,因为在每种情况下,在任何特定时间只需要一个资源。

有关如何使用同步类的信息,请参阅多线程处理:如何使用同步类。 有关同步的信息,请参阅 Windows SDK 中的同步。 有关 MFC 中的多线程处理支持的信息,请参阅使用 C++ 和 MFC 进行多线程处理

另请参阅

使用 C++ 和 MFC 进行多线程编程