Chinaunix首页 | 论坛 | 博客
  • 博客访问: 184907
  • 博文数量: 20
  • 博客积分: 3020
  • 博客等级: 中校
  • 技术积分: 940
  • 用 户 组: 普通用户
  • 注册时间: 2006-11-18 11:01
文章分类

全部博文(20)

文章存档

2011年(2)

2010年(8)

2009年(9)

2008年(1)

我的朋友
最近访客

分类: C/C++

2009-09-27 00:10:14

概述
ACE中的锁都是即可用于线程间也可用于进程间通信,一般是由构造函数的参数type指定。ACE提供的“原始锁”如:ACE_Mutex、ACE_Semaphore、ACE_File_Lock等等,这些锁都没有通过继承和多态的形式实现,而是各自独立地实现相关接口。这些“原始锁”之所以不用多态的形式,按ACE在文件Lock.h的解释:多态函数调用会增加20%的开销,有了多态函数就不能把锁放在共享内存中使用。
其实各“原始锁”之间虽没有用继承和多态统一接口,但各个独立的锁都实现了相同的接口名如:acquire、release等等。也就是说,各个“原始锁”概念上存在基类多态而具有相同的接口。但这个毕竟是概念上存在,还得提供在编程当中可操纵的具有多态性的锁,这个是由ACE_Lock类来实现了。ACE_Lock类的相关继承体系结果的中实际工作的子类把功能委托给相应的“原始锁”,它当然可以委托给不同的“原始锁”实现多态性,这主要是由ACE_Lock_Adapter类实现。
Guard
ACE_Guard类和其子类ACE_Write_Guard、ACE_Read_Guard
从广义上讲,类ACE_Guard是通过Adapter模式实现的,把要实现的功能委托给了模板参数指定的锁。
此类的背后设计思想和STL中的auto_ptr是一样的--运用了RAII。它适合用在一个形如{...}的作用域,在离开作用域(堆栈回滚)时能自动释放资源(锁)。
使用实例有:Atomic_Op。
   
Mutex
ACE_Mutex类-――主要用于进程
虽然根据构造函数的type参数,它可被用于线程也可用于进程,但是这个类主要是为实现进程间的mutex,是通过封装ACE_mutex_t类型实现。
在linux平台中ACE_mutex_t类型就是poxis类型的mutex,在文件os_pthread.h中声明。它是通过把poxis类型的mutex放在共享内存并通过pthread_mutexattr_setpshared接口把属性设置为PTHREAD_PROCESS_SHARED实现进程间通信的mutex。
在windows平台中ACE_mutex_t通过封装一个union联合体实现。union联合体的两个成员是windows平台的mutex(CreateMutex创建)和CRITICAL_SECTION,当是用于进程间通信时用windows平台的mutex,当是线程间通信时用CRITICAL_SECTION。当然windows平台的mutex也可用作线程间通信的互斥体,但它的开销比CRITICAL_SECTION用作线程间的互斥体大。
ACE_Process_Mutex类
 把具体实现功能委托给ACE_SV_Semaphore_Complex或ACE_Mutex(可在编译时决定)。当把功能委托给ACE_SV_Semaphore_Complex时,初始化Semaphore的值为1而实现Mutex功能。当把功能委托给ACE_Mutex时,参数type用USYNC_PROCESS可实现进程间的通信。
RW_Process_Mutex类
RW_Process_Mutex类封装ACE_File_Lock,ACE_File_Lock封装ace_flock_t类型及其相关操作。
在linux平台ace_flock_t类型是封装fcntl相关操作。
在windows平台ace_flock_t类型是封装SetFilePointer、LockFile等相关接口。
ACE_RW_Mutex类和其子类ACE_RW_Thread_Mutex
ACE_RW_Mutex类根据构造函数的type参数,它可被用于线程也可用于进程,默认是用于线程。它是对ACE_rwlock_t的封装操作。
在Linux中ACE_rwlock_t就是pthread_rwlock_t。
在windows平台没有直接提供此类型,另行实现此功能。
ACE_Thread_Mutex类
ACE_Thread_Mutex封装ACE_thread_mutex_t类型及其相关操作。
       在linux平台中ACE_thread_mutex_t类型就是poxis类型的mutex。
       在windows平台中ACE_thread_mutex_t类型就是CRITICAL_SECTION。
ACE_Recursive_Thread_Mutex类
在Linux中ACE_Recursive_Thread_Mutex是对ACE_recursive_thread_mutex_t的类型及其操作的封装。ACE_recursive_thread_mutex_t是poxis类型的mutex。在Linux是通过函数pthread_mutexattr_settype使mutex支持recursive的。
*Null_Mutex*相关类
    空操作。
Semaphore
ACE_Semaphore类和其子类ACE_Thread_Semaphore
其语义符合Posix信号灯,直接封装ACE_sema_t类型及其相关操作。
在Linux平台中ACE_sema_t是封装Posix信号灯(sema_t)。根据构造函数的参数type,ACE_Semaphore可用于进程也可用于线程。
在Windows平台中ACE_sema_t直接封装Semaphore内核对象,所封装的相关接口有:CreateSemaphoreA、ReleaseSemaphore、WaitForSingleObject。
ACE_SV_Semaphore_Simple类
    封装System V信号灯,在构造函数和析构函数中没有处理多进程的情况(竞争条件)。
ACE_SV_Semaphore_Complex类
ACE_SV_Semaphore_Complex是ACE_SV_Semaphore_Simple的子类。它在构造函数和析构函数中处理了竞争条件。
ACE_Process_Semaphore类
封装ACE_Semaphore类或ACE_SV_Semaphore_Complex类,如果系统支持System V就使用ACE_Semaphore类。
ACE_Null_Semaphore类
   空操作。
Condition
ACE_Condition类
 封装Mutex和condition的相关操作。Mutex以模板参数提供,它只能以这些类实例化:ACE_Thread_Mutex,ACE_Recursive_Thread_Mutex或是ACE_Null_Mutex。
ACE_Condition_Thread_Mutex类
 封装ACE_Thread_Mutex和condition的相关操作。
ACE_Null_Condition类
空操作。
ACE_Barrier
ACE_Barrier的功能是“阻塞所有在执行的线程,直到它们全部到达栅栏为止,然后所有线程继续执行”。
 
ACE_Token
ACE_Token实现了等待线程以FIFO/LIFO次序唤醒,上锁操作是可递归的,并且实现了读写锁的语义,不过两个读锁不可以同时进行。
Lock
ACE_Lock抽象类和其抽象子类ACE_Adaptive_Lock类
要通过继承实现其接口。ACE_Adaptive_Lock的接口实现是通过重载其构造函数。
ACE_Lock_Adapter类
ACE_Lock_Adapter是ACE_Lock类的子类,通过Adapter模式实现。它把具体实现接口的功能委托给了模板参数指定的“原始锁”。模板参数的实例化可以是ACE_Mutex, ACE_Semaphore,ACE_RW_Mutex等等。
ACE_Reverse_Lock类
ACE_Reverse_Lock类是ACE_Lock类的子类,它实现机制类似于ACE_Lock_Adapter类,不过其锁的语义如其名字Reverse,正好是和通常的语义正好相反,如调用acquire,其实是正常情形下的release。
ACE_File_Lock类
ACE_File_Lock封装fcntl,用W.Richard Stevens的话:fcntl提供范围锁(原叫记录锁)。
ACE_Static_Object_Lock类
    用于串行化构造单件对象。
注意
    Mutex和Semaphore语义之不同。各种锁的持续性之不同。

本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/appstudy/archive/2009/06/12/4264383.aspx
阅读(1341) | 评论(0) | 转发(0) |
0

上一篇:ACE 配置

下一篇:vs2003编译ACE

给主人留下些什么吧!~~