互斥体对象、信号对象和事件对象也可以用于进程间的线程同步操作。在用 Win32 函
数创建了对象时,我们可以指定对象的名字,还可以设置同步对象在子进程的继承性。创
建返回的是 HANDLE 句柄,我们可以用函数 DuplicateHandle 来复制对象句柄,这样每个
进程都可以拥有同一对象的句柄,实现进程之间的线程同步操作。另外,在同一进程内,
我们可以用 OpenMutex、OpenSemaphore 和 OpenEvent 来获得指定名字的同步对象的
句柄。r
排斥区异步执行的线程同步方法只能用于同一进程的线程之间共享资源处理,但是这
种方法的使用效率较高,而且编程也相对简单一些。r
在 Visual C++中,除了利用 Win32 函数进行多线程同步控制外,如果我们用到了
MFC 类库,则可利用已经封装成 C++类结构的同步对象,使我们的编程更加简捷。r
三、基于 MFC 的多线程编程r
在 Visual C++ 5.0 附带的 MFC 4.21 类库中,也提供了多线程编程的支持,基本原理
与上面所讲的基于 Win32 函数的设计一致,但由于 MFC 对同步对象作了封装,因此对用
户编程实现来说更加方便,避免了对象句柄管理上的繁琐工作。更重要的是,在多个窗口
线程情况下,MFC 中直接提供了用户接口线程的设计。r
在 MFC 中,线程分为两种:用户接口线程和辅助线程。用户接口线程常用于接收用
户的输入,处理相应的事件和消息。在用户接口线程中,包含一个消息处理循环,其中
CWinApp 就是一个典型的例子,它从 CWinThread 派生出来,负责处理用户输入产生的事
件和消息。辅助线程常用于任务处理(比如计算)不要求用户输入,对用户而言,它在后
台运行。Win32 API 并不区分这两种线程的类型,它只是获取线程的起始地址,然后开始
执行线程。而 MFC 则针对不同的用户需要作了分类。如果我们需要编写多个有用户接口
的线程的应用程序,则利用 Win32 API 要写很多的框架代码来完成每个线程的消息事件的
处理,而用 MFC 则可以充分发挥 MFC 中类的强大功能,还可以使用 ClassWizard 来帮助
管理类的消息映射和成员变量等,我们就可以把精力集中到应用程序的相关代码编写上。r
辅助线程编程较为简单,设计的思路与上节所讲的基本一致:一个基本函数代表了一
个线程,创建并启动线程后,则线程进入运行状态;如果线程用到共享资源,则需要进行
资源同步处理。共享资源的同步处理在两种线程模式下完全一致。r
我们知道:基于 MFC 的应用程序有一个应用对象,它是 CWinApp 派生类的对象,该
对象代表了应用进程的主线程。当线程执行完(通常是接收到 WM_QUIT 消息)并退出线程
时,由于进程中没有其它线程的存在,故进程也自动结束。类 CWinApp 从 CWinThread
派生出来,CWinThread 是用户接口线程的基本类。我们在编写用户接口线程时,需要从
CWinThread 派生我们自己的线程类,ClassWizard 可以帮助我们完成这个工作。r
下面列出编写用户接口线程的基本步骤。r
1.用 ClassWizard 派生一个新的类,设置基类为 CWinThread