ACE框架常用的同步机制设计成统一的原语接口。同步原语使用系统平台(操作系统,多线程库)提供的同步原语,并为系统平台不提供的同步原语提供模拟实现。ACE框架使用了外观模式和适配器分两层,将同步原语统一接口。
在外观包装层,ACE框架为每种同步原语将系统平台不同的同步原语函数统一成一致的函数接口集,并提供系统平台不支持的同步原语的模拟的实现。这一层位于ACE_OS命名空间层。
ACE框架定义了7种系统平台需要提供的同步原语,包括有条件变量,事件,互斥体(锁),线程锁,可递归锁,读写锁以及信号量。
并没有一个系统平台支持所有的同步原语,并且不同系统平台的原语函数各不相同。在这层ACE框架为这些同步原语函数定义了统一的外观。
Windows平台支持事件,互斥体(锁)Mutext,线程锁 CriticalSection,可递归锁CriticalSection,信号量Semaphore,但不支持条件变量,读写锁。
Solaris平台支持互斥体(锁)mutex_t,信号量sema_t,条件变量cond_t,读写锁rwlock_t,但并不支持事件,可递归锁。
Linux平台,操作系统只提供信号量sem_t同步原语的系统调用,其它同步原语必须依赖线程库Pthread。
线程库Pthread,实现了互斥体(锁)pthread_mutex_t,条件变量pthread_cond_t,读写锁pthread_rwlock_t,并提供一个信号量的模拟实现,但不支持事件,可递归锁。
ACE为不支持的同步原语提供了实现模拟,分别有事件ACE_event_t,条件变更ACE_cond_t,事件ACE_event_t,以及信号量ACE_sema_t。
Windows平台的同步原语外观实现:(红色为ACE定义的同步对象外观,黄色为实现)
Linux平台的外观实现:
虽然为7种同步原语各自统一了函数外观,但使用起来还很繁杂,不同的同步原语之间的函数不兼容,并且不利于开发中同步原语的替换。在适配层,ACE使用相同的接口包装了每种同步原语的使用,并且使同步原语轻易地使用在模板泛型开发。
ACE_Barrier是更高一层的同步原语。