MFC 提供的多线程类分为两类:同步对象(CSyncObject、CSemaphore、CMutex、CCriticalSection 和 CEvent)和同步访问对象(CMultiLock 和 CSingleLock)。
当必须控制对资源的访问以确保资源的完整性时,使用同步类。 同步访问类用于获取对这些资源的访问权。 本主题介绍各个类的适用情况。
若要确定应使用的同步类,请询问以下一系列问题:
-
是否必须等到发生某事时,应用程序才能访问资源(例如,在将数据写入文件之前,必须先从通信端口接收它)?
如果是,请使用 CEvent。
-
同一应用程序内的多个线程是否可以同时访问此资源(例如,应用程序允许在同一文档上最多同时打开五个带有视图的窗口)?
如果是,请使用 CSemaphore。
-
是否可以有一个以上的应用程序使用此资源(例如,资源在 DLL 中)?
如果是,请使用 CMutex。
如果不是,请使用 CCriticalSection。
从不直接使用 CSyncObject。 它是其他四个同步类的基类。
选择要使用的同步访问类更为简单。 如果应用程序只与访问单个受控资源有关,请使用 CSingleLock。 如果需要访问多个受控资源中的任何一个,则使用 CMultiLock。 在示例 1 中,应使用 CSingleLock,因为在每种情况下,任何特定时间都只需要一个资源。
有关如何使用同步类的信息,请参见多线程处理:如何使用同步类。 有关同步的信息,请参见 Windows SDK 中的同步。 有关 MFC 中多线程处理支持的信息,请参见使用 C++ 和 MFC 进行多线程处理。