ace的锁概述

概述

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模式实现的,把要实现的功能委托给了模板参数<ACE_LOCK>指定的锁。

此类的背后设计思想和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/sanlongcai/archive/2009/02/18/3907876.aspx

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值