文章内容来源于《ACE自适配通信环境中文技术文档》
1.ACE 线程封装组件的体系
1.1 ACE锁(Lock)类属
·Mutex、Thread_Mutex和Process_Mutex:这些类提供简单而高效的机制来序列化对共享资源(比如共享内存中的文件或对象)的访问。它们封装了Solaris、POSIX和Win32同步变量(分别是mutex_t、pthread_mutex_t和HANDLE);
·RW_Mutex、RM_Thread_Mutex、RW_Process_Mutex:这些类序列化对共享资源的访问,其中的内容较少变动,而是更多地用于搜索。它们封装了Solaris rwlock_t同步变量(POSIX pthreads和Win32线程实现使用其他机制);
·Semaphore、Thread_Semaphore、Process_Semaphore:这些类实现了Dijkstra的“计数信号量”抽象(一种用于序列化多线程控制的通用机制)。它们封装了Solaris sema_t同步变量(POSIX pthreads和Win32线程实现使用其他机制);
·Null_Mutex:Null_Mutex类提供一种零开销的锁接口实现,被其他C++封装用于同步。
·Token(令牌):Token类提供一种比Mutex更为通用的同步机制。例如,它实现了“递归互斥体”语义,拥有令牌的线程可以重新获取它,而不会导致死锁。此外,当其他线程释放令牌时,阻塞在该令牌上的线程以严格的FIFO(先进先出)的顺序被服务(相反,Mutex并不严格地强制实行一种获取顺序)。
·Recursive_Thread_Mutex:通过允许嵌套调用acquire方法(只要拥有该锁的线程也是重新获取它的线程),Recursive_Thread_Mutex扩展了缺省的Solaris线程互斥体语义。它与上面概述的Thread_Mutex类一起工作;
1.2 ACE守卫(Guard)类属
·Guard、Write_Guard和Read_Guard:这些类确保在进入和退出一个C++代码块时分别被自动获取和释放锁。(RAII)
·Thread_Control:Thread_Control类与Thread_Manager类相结合,用于在线程的发起函数中自动进行优雅的终止和清扫活动。
1.3 ACE条件(Condition)类属
·Condition:Condition类用于在涉及共享数据的条件表达式的状态发生变化时进行阻塞。它封装了Solaris和POSIX pthreads cond_t同步变量(Win32线程使用其他机制实现);
·Null_Condition:Null_Condition类提供零开销的Condition接口实现,用于单线程应用。
1.4 ACE管理器(Manager)类属
·Thread_Manager:Thread_Manager类含有一套机制来对相互协作以实现集体行为的成组线程进行管理。
·Thread_Spawn:Thread_Spawn提供一种标准工具,对为并发地处理来自客户的请求所进行的线程创建进行管理。
1.5 ACE主动对象(Active
Object)类属
·Task(任务):Task类是ACE中用于定义主动对象的中心机制。这些主动对象将输入输出消息排队,并在分离的线程控制中执行用户定义的消息处理服务。
1.6杂项ACE并发类
·Thread:Thread类封装Solaris线程、POSIX Pthreads和Win32线程族的线程创建、终止和管理例程。
·Atomic_Op:Atomic_Op类将同步特性透明地参数化进基本的算术操作。
·Barrier(栅栏):Barrier类实现“栅栏同步”,对于许多类型的并行科学应用特别有用。
·TSS:TSS类允许“物理上”线程专有的对象被“逻辑地”当作程序的全局对象进行访问。
2.基本概念
2.1 互斥锁
互斥锁(通常称为“互斥体”或“二元信号量”)用于保护多线程控制并发访问的共享资源的完整性。互斥体通过定义临界区来序列化多线程控制的执行,在临界区中每一时刻只有一个线程在执行它的代码。互斥体简单(例如,只有拥有该互斥体的线程可以释放它)而高效(时间和空间)。
2.2 读者/作者锁
读者/作者锁与互斥体相类似。例如,获取读者/作者锁的线程也必须释放它。多个线程可同时获取一个读者/作者锁用于读,但只有一个线程可以获取该锁用于写。当互斥体保护的资源用于读远比用于写要频繁时,读者/作者互斥体有助于改善并发的执行。
2.3计数信号量
计数信号量是可以原子地增减的整数。如果线程试图减少一个值为零的信号量的值,它就会阻塞,直到另一个线程增加该信号量的值。
计数信号量用于追踪共享程序状态的变化。它们记录某种特定事件的发生。因为信号量维护状态,它们允许线程根据该状态来作决定,即使事件是发生在过去。
2.4条件变量
条件变量提供风格与互斥体、读者/写者锁和计数信号量不同的锁定机制。当持有锁的线程在临界区执行代码时,这三种机制让协作线程进行等待。相反,条件变量通常被一个线程用于使自己等待,直到
一个涉及共享数据的条件表达式到达特定的状态。当另外的协作线程指示共享数据的状态已发生变化,调度器就唤醒一个在该条件变量上挂起的线程。于是新唤醒的 线程重新对它的条件表达式进行求值,如果共享数据已到达合适状态,就恢复处理。
被条件变量等待的条件表达式可以任意地复杂。一般而言,与其他同步机制相比,条件变量允许更为复杂的调度决策。条件变量同步使用休眠锁来实现,休眠锁触发上下文切换,并允许另一线程执行,直到锁被获取。
阅读(2032) | 评论(0) | 转发(0) |