zthread学习 实例十五ZThread库基本结构的规纳

来源:互联网 发布:手机编程前景 编辑:程序博客网 时间:2024/04/29 02:34

1、四大基类

 Cancelable

Cancelable提供了通用的方法来定义语义,调用了cancel()的Cancelable对象,将被置为disable。调用过cancel()ed的对象不必立即中止工作。通常被cancel()ed的对象尽可能快的继续执行完当前分配给它的工作,然后再变得不可用;但它不能接受任何新分配给它的工作。

cancel()函数:使一个Cancelable对象变为disable状态。拒绝接受新任务,尽可能快的完成当前任务;对一个Cancelable对象多于一次的cancel()操作都是无效的。isCanceled():查询Cancelable对象是否已经是canceled的状态。


Waitable

Waitable提供了通用的方法来定义语义,一个对象可以通过Waitable的接口来测试其内部状态。其他对象可以wait()一个Waitable对象。在这种情况下,如果调用线程的condition为false将会阻塞此线程。举例,Condition是一个Waitable对象,因此它的wait()是意思是阻塞线程直到有外部激励来改变Condition的内部状态为true。还有Barrier、Executor等。


Lockable

Lockable添加了通用方法acquire()、release(),它不一定是互斥访问的。


 

NonCopyable

一些对象是不能被拷贝的。特别是一些互斥访问的东西,例如,事件对象,队列,信号量等等



2、Mutex种类

 

Mutex

[定义]:Mutex对象用于串行的访问临界区,通过acquire()进入临界区,release()离开临界区。

[调度方式]:FIFO的顺序。

[异常]:A Mutex will throw a Deadlock_Exception if an attempt to acquire a Mutex more than once is made from the context of the same thread. A Mutex will throw an InvalidOp_Exception if an attempt to release a Mutex is made from the context of a thread that does not currently own that Mutex.

 


FastMutex

[定义]:FastMutex是一个效率稍微好一点非递归互斥锁。它的实现比其他的Mutex类执行速度快,但这样它却牺牲了它的健壮性。它的一个性质是acquire()和tryAcquire()时不会抛出中断异常。

[调度方式]:由操作系统决定。

[异常]:无

 

RecursiveMutex

[定义]:它是一种递归的Mutex,因为它可以在同一个线程中多于一次的aquire()/release(),却不会死锁(抛出Deadlock_Exception异常)

[调度方式]:FIFO的顺序。

[异常]: A Mutex will throw an InvalidOp_Exception if an attempt to release() a Mutex is made from the context of a thread that does not currently own that Mutex.



PriorityMutex

[定义]:PriorityMutex类似于其他的Mutex,不同之处在于它有不同于其他Mutex的调度策略。

[调度方式]:如果多个线程争夺调用acquire(),则按线程优先级的顺序来调度,高优先级的线程先进入。

 

PriorityInheritanceMutex

[定义]:PriorityInheritanceMutex类似于PriorityMutex,不同之处在于它有独特的调度方式。

[调度方式]:也类似于PriorityMutex,高优先级的线程先进入。一个高优先级的线程试图进入acquire(),在即将阻塞优先级的线程时,如果此时这个低优先级的线程已经执行了acquire(),此时它将临时提高线程的优先级来适应这个调度,一直到执行release()后恢复以前的优先级。


3、Executor的种类
ThreadedExecutor:该执行器为每一个任务创建一个线程,当任务过多时,会导致过多的开销。
PoolExecutor:线程池,以一个有限的线程集来执行提交的任务。预先将开销很大的线程分配工作一次性做完,在可能的时候重用这些线程,这样做可以节省很多时间,因为不会为每一个线程都创建线程。不会因为任务过多而导致过多的开销。适用于有大量的任务请求时使用。
ConcurrentExecutor:类似于PoolExecutor,只是它只会存在一个大小固定的线程。如果多个任务被提交至ConcurrentExecutor,每一个任务都会在上一个任务执行完成之后开始执行完成,所有的任务使用同一个线程。
SynchronousExecutor:类似于ConcurrentExecutor,同一时刻只运行一个任务,串行代替了并发。但SynchronousExecutor不会创建和管理线程,它使用提交任务的线程。

4、Queue种类
提供了一系列的可以同步get()/put()元素的队列。
BlockingQueue
[定义]:只是简单的实现了线性的访问被添加的元素。
BlockingQueue
[定义]:类似于BlockingQueue,线性的访问被添加的元素,不同在于线程调用next()将会阻塞一直到有一个元素变得可用。
MonitoredQueue
[定义]:只是简单的实现了线性的访问被添加的元素。
[使用方法]:线程调用empty()方法,将会阻塞线程一直到MonitoredQueue为空;线程调用next()方法,也将会阻塞一直到MonitoredQueue有一个元素返回。
BoundedQueue
[定义]:线性的访问一组value,不同于其他队列的是该队列必须初始化为一个因定的大小。
[使用方法]:线程调用empty()方法,将会阻塞线程一直到BoundedQueue为空;线程调用next()方法,也将会阻塞一直到BoundedQueue有一个元素返回;线程调用add()方法,也将阻塞一直到元素个数小于初始化的大小。

5、Condition种类

Conditiong :是一个Waitable对象,用来阻塞一个线程直到某种条件出现,一个Condition对象总是需要一个Lockable对象的协助,这个对象可以是FastMutex、 Mutex、 PriorityMutex、PriorityInheritanceMutex。和其他的对象一样,Condition对Thread::interupt是敏感的,可以用来提前结束wait()。Condition执行过程:进入wait()时,首先执行与之关联的Lockable对象的acquire()操作,wait()真正开始时,这个Lockable对象执行release()。
PriorityCondition:是一个对线程优先级敏感的Condition。它的调度受线程优先级高低影响。

6、异常种类
Synchronization_Exception: 所有异常类的基类,一般用于在开启线程地方来捕捉所有可能异常(注意:异常是不能跨线程传递的,每个线程须自己处理自己的异常)。
Interrupted_Exception: 用来描述一个阻塞线程的interrupted操作,一般用作于阻塞线程的退出的一种方式,即以抛异常的方式结束线程。
Deadlock_Exception: 侦测到死锁发生时抛出。
InvalidOp_Exception: 一个非法的操作时抛出。
Initialization_Exception: 在创建一个同步对象时,如果没有足够的资源来分配给它时抛出此异常。
Cancellation_Exception: 通过对象的Canceled()操作抛出。
Timeout_Exception: 不需要提供出错信息,在操作时间最后超时抛出。
NoSuchElement_Exception: 最后一次操作在各种Queue中没有一个Item时抛出。
InvalidTask_Exception: 在任务变成无效时抛出。(例如:为NULL,或Task没有重载run()方法)
BrokenBarrier_Exception: 因为线程集中的一个线程因为已经中断(interrupt()),而breakn了Barrier对象时抛出。
Future_Exception: 一个未知的异常。

7、Singleton(单件)
使用static来达到唯一的目的,使用方法举例:int* p = Singleton<int>::instance();
0 0
原创粉丝点击