Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1466722
  • 博文数量: 218
  • 博客积分: 6394
  • 博客等级: 准将
  • 技术积分: 2563
  • 用 户 组: 普通用户
  • 注册时间: 2008-02-08 15:33
个人简介

持之以恒

文章分类

全部博文(218)

文章存档

2013年(8)

2012年(2)

2011年(21)

2010年(55)

2009年(116)

2008年(16)

分类: 网络与安全

2010-01-10 18:37:27

文章内容来源于《ACE自适配通信环境中文技术文档》
1.ACE 线程封装组件的体系
1.1 ACE锁(Lock)类属
    ·MutexThread_MutexProcess_Mutex这些类提供简单而高效的机制来序列化对共享资源(比如共享内存中的文件或对象)的访问。它们封装了Solaris、POSIX和Win32同步变量(分别是mutex_t、pthread_mutex_t和HANDLE);
    ·RW_MutexRM_Thread_MutexRW_Process_Mutex这些类序列化对共享资源的访问,其中的内容较少变动,而是更多地用于搜索。它们封装了Solaris rwlock_t同步变量(POSIX pthreads和Win32线程实现使用其他机制);
    ·SemaphoreThread_SemaphoreProcess_Semaphore这些类实现了Dijkstra的“计数信号量”抽象(一种用于序列化多线程控制的通用机制)。它们封装了Solaris sema_t同步变量(POSIX pthreads和Win32线程实现使用其他机制);
    ·Null_MutexNull_Mutex类提供一种零开销的锁接口实现,被其他C++封装用于同步。
    ·Token(令牌):Token类提供一种比Mutex更为通用的同步机制。例如,它实现了“递归互斥体”语义,拥有令牌的线程可以重新获取它,而不会导致死锁。此外,当其他线程释放令牌时,阻塞在该令牌上的线程以严格的FIFO(先进先出)的顺序被服务(相反,Mutex并不严格地强制实行一种获取顺序)。

    ·Recursive_Thread_Mutex通过允许嵌套调用acquire方法(只要拥有该锁的线程也是重新获取它的线程),Recursive_Thread_Mutex扩展了缺省的Solaris线程互斥体语义。它与上面概述的Thread_Mutex类一起工作;

1.2 ACE守卫(Guard)类属
    ·GuardWrite_GuardRead_Guard这些类确保在进入和退出一个C++代码块时分别被自动获取和释放锁。(RAII)
    ·Thread_ControlThread_Control类与Thread_Manager类相结合,用于在线程的发起函数中自动进行优雅的终止和清扫活动。
1.3 ACE条件(Condition)类属
    ·ConditionCondition类用于在涉及共享数据的条件表达式的状态发生变化时进行阻塞。它封装了Solaris和POSIX pthreads cond_t同步变量(Win32线程使用其他机制实现);
    ·Null_ConditionNull_Condition类提供零开销的Condition接口实现,用于单线程应用。
1.4 ACE管理器(Manager)类属
    ·Thread_ManagerThread_Manager类含有一套机制来对相互协作以实现集体行为的成组线程进行管理。     
    ·Thread_SpawnThread_Spawn提供一种标准工具,对为并发地处理来自客户的请求所进行的线程创建进行管理。

1.5 ACE主动对象(Active Object)类属

    ·Task(任务):Task类是ACE中用于定义主动对象的中心机制。这些主动对象将输入输出消息排队,并在分离的线程控制中执行用户定义的消息处理服务。
1.6杂项ACE并发类
    ·ThreadThread类封装Solaris线程、POSIX Pthreads和Win32线程族的线程创建、终止和管理例程。
    ·Atomic_OpAtomic_Op类将同步特性透明地参数化进基本的算术操作。
    ·Barrier(栅栏):Barrier类实现“栅栏同步”,对于许多类型的并行科学应用特别有用。
    ·TSSTSS类允许“物理上”线程专有的对象被“逻辑地”当作程序的全局对象进行访问。

2.基本概念

2.1 互斥锁

互斥锁(通常称为“互斥体”或“二元信号量”)用于保护多线程控制并发访问的共享资源的完整性。互斥体通过定义临界区来序列化多线程控制的执行,在临界区中每一时刻只有一个线程在执行它的代码。互斥体简单(例如,只有拥有该互斥体的线程可以释放它)而高效(时间和空间)。

2.2 读者/作者锁

读者/作者锁与互斥体相类似。例如,获取读者/作者锁的线程也必须释放它。多个线程可同时获取一个读者/作者锁用于读,但只有一个线程可以获取该锁用于写。当互斥体保护的资源用于读远比用于写要频繁时,读者/作者互斥体有助于改善并发的执行。

2.3计数信号量

计数信号量是可以原子地增减的整数。如果线程试图减少一个值为零的信号量的值,它就会阻塞,直到另一个线程增加该信号量的值。

计数信号量用于追踪共享程序状态的变化。它们记录某种特定事件的发生。因为信号量维护状态,它们允许线程根据该状态来作决定,即使事件是发生在过去。

2.4条件变量

条件变量提供风格与互斥体、读者/写者锁和计数信号量不同的锁定机制。当持有锁的线程在临界区执行代码时,这三种机制让协作线程进行等待。相反,条件变量通常被一个线程用于使自己等待,直到 一个涉及共享数据的条件表达式到达特定的状态。当另外的协作线程指示共享数据的状态已发生变化,调度器就唤醒一个在该条件变量上挂起的线程。于是新唤醒的 线程重新对它的条件表达式进行求值,如果共享数据已到达合适状态,就恢复处理。

被条件变量等待的条件表达式可以任意地复杂。一般而言,与其他同步机制相比,条件变量允许更为复杂的调度决策。条件变量同步使用休眠锁来实现,休眠锁触发上下文切换,并允许另一线程执行,直到锁被获取。



阅读(1991) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~