andylin02 发表于 2013-1-15 02:53:00

ACE线程管理机制-并发控制(1)


ACE Lock类属
锁类属包含的类包装简单的锁定机制,比如互斥体、信号量、读/写互斥体和令牌等。这里我就以互斥体为例简单的介绍一下其使用方法,对其它的锁类进行一些简单的说明。
1.互斥体的使用。
互斥体用于保护共享的易变代码,也就是全局或静态数据。这样的数据必须通过互斥体进行保护,以防止它们在多个线程同时访问时损坏。
在ACE中可以通过ACE_Thread_Mutex实现线程的访问互斥,下面的例子演示ACE_Thread_Mutex类的使用。
 
#include "ace/Thread.h" #include "ace/Synch.h" #include <iostream>using namespace std;ACE_Thread_Mutex mutex;void* Thread1(void *arg) {mutex.acquire();ACE_OS::sleep(3);cout<<endl<<"hello thread1"<<endl;mutex.release();return NULL; } void* Thread2(void *arg) {mutex.acquire();cout<<endl<<"hello thread2"<<endl;mutex.release();return NULL; } int main(int argc, char *argv[]) { ACE_Thread::spawn((ACE_THR_FUNC)Thread1);//Thread2 比Thread1晚创建1秒钟,故后尝试获取互斥体ACE_OS::sleep(1);ACE_Thread::spawn((ACE_THR_FUNC)Thread2);while(true)ACE_OS::sleep(10);return 0; }  
ACE_Thread_Mutex主要有两个方法:

[*]acquire():用来获取互斥体,如果无法获取,将阻塞至获取到为止。
[*]release():用来释放互斥体,从而使自己或者其它线程能够获取互斥体。
当线程要访问共享资源时,首先调用acquire()方法获取互斥体,从而获取对改互斥体所保护的共享资源的唯一访问权限,访问结束时调用释放互斥体,使得其它线程能获取共享资源的访问权限。
在此例中,本来Thread2的打印消息在Thread1之前,但由于Thread1先获得互斥体,故Thread2只有待Thread1结束后才能进入临界区。读者朋友们可以通过将ACE_Thread_Mutex替换为ACE_NULL_Mutex看一下不加锁的执行结果。
2.ACE Lock类属简介。
ACE Lock类属列表如下:
名字
描述
ACE_Mutex
封装互斥机制(根据平台,可以是mutex_t、pthread_mutex_t等等)的包装类,用于提供简单而有效的机制来使对共享资源的访问序列化。它与二元信号量(binary semaphore)的功能相类似。可被用于线程和进程间的互斥。
ACE_Thread_Mutex
可用于替换ACE_Mutex,专用于线程同步。
ACE_Process_Mutex
可用于替换ACE_Mutex,专用于进程同步。
ACE_NULL_Mutex
提供了ACE_Mutex接口的"无为"(do-nothing)实现,可在不需要同步时用作替换。
ACE_RW_Mutex
封装读者/作者锁的包装类。它们是分别为读和写进行获取的锁,在没有作者在写的时候,多个读者可以同时进行读取。
ACE_RW_Thread_Mutex
可用于替换ACE_RW_Mutex,专用于线程同步。
ACE_RW_Process_Mutex
可用于替换ACE_RW_Mutex,专用于进程同步。
ACE_Semaphore
这些类实现计数信号量,在有固定数量的线程可以同时访问一个资源时很有用。在OS不提供这种同步机制的情况下,可通过互斥体来进行模拟。
ACE_Thread_Semaphore
应被用于替换ACE_Semaphore,专用于线程同步。
ACE_Process_Semaphore
应被用于替换ACE_Semaphore,专用于进程同步。
ACE_Token
提供"递归互斥体"(recursive mutex),也就是,当前持有某令牌的线程可以多次重新获取它,而不会阻塞。而且,当令牌被释放时,它确保下一个正阻塞并等待此令牌的线程就是下一个被放行的线程。
ACE_Null_Token
令牌接口的"无为"(do-nothing)实现,在你知道不会出现多个线程时使用。
ACE_Lock
定义锁定接口的接口类。一个纯虚类,如果使用的话,必须承受虚函数调用开销。
ACE_Lock_Adapter
基于模板的适配器,允许将前面提到的任意一种锁定机制适配到ACE_Lock接口。
页: [1]
查看完整版本: ACE线程管理机制-并发控制(1)