C++面向对象多线程学习笔记_类层次和线程处理C++组件

类层次(class hierarchy)是一些通过继承(inheritance)相关联的类的集合。它的一些常见类类型有:

*抽象基类;

*具体类;

*节点类;

*接口类;

*容器和集合类;

*应用框架类;

*域类。

1. 抽象基类

抽象基类为所有后代提供蓝图,它作为从它派生的所有类的一套原则和接口策略。为了使用抽象类,用户必须首先从基类派生出一个新类,并为抽象类中声明的所有纯虚函数提供实际的定义。抽象类在C++语言结构中的身份是纯虚函数,对于一个抽象类,它必须至少有一个纯虚函数。

2. 具体类

具体类作为纯结类来设计和实现。它表示祖先-后代世系中的结束。它没有虚函数,不打算用来被继承,只是按现在的样子进行直接使用。

2.1 节点类:

它提供继承和多态的基础。与抽象基类一样,节点类设计用于被继承,但它不包含纯虚函数。节点类可以立即使用,不过节点类的设计还同时着眼于未来,它的设计具有可重用性,同时提供可以在派生类中覆盖的虚成员函数。它还提供可以被派生类继承的受保护数据成员和成员函数。它使用基类的指针和引用使得可以操纵后代类中的成员函数。

2.2 线程与容器和集合类

与大部分C++组件类型一样,在多线程程序中,集合和容器类与线程交互的主要途径有两种:

*线程间通信;

*多线程服务器。

与一般情况下将数据结构用作多个进程间通信机制相比,使用面向对象组件进行线程间通信具有巨大的优点。进程间的数据通信通常位于线性数据结构中,例如队列和管道中。这些数据结构没有提供图表、集和映射所提供的表达力。当在进程间传递数据时,程序员被迫将通信看作多个进程间的一种简单线性数据或消息交换。

多线程类的简单架构:

为了设计多线程类,我们至少需要6个基本组件:

a.宿主类(host class);

b.线程类(thread class);

c.互斥和事件类(mutex and event class);

d.友元成员函数(friend member function);

e.域类(domain class);

f.强制转换基本元素(casting primitive)。

宿主类是用户与之交互的类。有两种常用的多线程宿主类。第一种类型是多线程应用程序框架;第二种类型是多线程服务器。宿主类被分解成两个或更多的线程,每个线程执行宿主类的一个友元函数。当执行友元函数时,宿主类将this指针作为一个参数传递给该线程。this指针在友元函数中被强制转换成指向适当类型的类。this指针形成了宿主类与位于另一个线程中的域类间的线程间通信。每个友元函数将创建一个或多个域对象来完成线程的请求。

2.3 应用框架类

在所有能够以软件重用为目标构建的面向对象组件中,也许面向对象应用框架最难以构建,但一旦构建后却能提供最大好处的组件。与容器类、集合类以及类型的类层次相比,应用框架一般情况下是最易于理解的面向对象类层次。但它又是最难以构建的类层类,因为它们为思想建模。也就是说,应用框架为对象交互、工作模式、动作序列、软件事务以及进程内容来建模。

应用框架为一般性面向对象应用。这个框架以类层次的形式捕获应用具有的动作、工作模式和处理内容的序列。它用作整个应用的模式,具体化应用具有的基础结构或骨架,而没有提供应用的细节。它指定了面向对象架构中软件部分间的关系、责任和协议。

应用框架的目标是成功一般化工作模式。应用框架的设计需要对软件分解有一个全面的理解,因为设计者必须将框架分解成提供者实现和客户实现部分。在多线程应用框架中,框架执行的工作模式必须分解成一套线程。框架的实质是需要分解成它的一般性部分以及特定应用的部分。

应用框架由相关类的集合组成。它的成员函数有一个预设计的、内置的交互模式这套相关类和预设计交互模式为程序员提供一些一般性问题的特定解决方案。

应用框架总是至少分解为两个主要组件。第一个组件为框架设计者提供的框架部分。这个组件包含按一般性方式捕获的特定动作序列以及对象间的关系,它表示某问题类别的一种常用解决方案。第二个组件称做ensemble,它具体表现域知识、专家知识、规则以及特定解决方案的策略。ensemble由框架的用户提供,而框架本身提供了应用的形式,ensemble提供应用的具体内容。

你可能感兴趣的:(C++面向对象多线程学习笔记_类层次和线程处理C++组件)