ACE中的守卫类是一种模板,它通过所需锁定机制的类型来参数化。
守卫类的对象定义一个代码块,在其上获取一个锁,在退出次代码块时,锁被自动释放(对象的构造器获取锁,析构器释放锁)。
ACE_Guard,ACE_Read_Guard,ACE_Write_Guard。
#include "ace/Synch.h" ///sleep
#include "ace/Thread.h"
#include "ace/Guard_T.h"
#include "ace/Log_Msg.h"
#include "ace/OS_NS_stdio.h" ///ACE_OS::printf
int number=10;
class args
{
public:
args():mutex_() {}
ACE_Thread_Mutex mutex_;
};
static void* worker(void *arguments)
{
args *arg=(args*)arguments;
//ACE_Thread_Mutex mutex_=*((ACE_Thread_Mutex*)arguments); error
for(;;)
{
ACE_Guard<ACE_Thread_Mutex> guard(arg->mutex_);
//{
//this is our critical section
if(number>0)
{
ACE_OS::sleep(1);
number--;
ACE_OS::printf("Number: %d \n",number);
}
else
break;
//} //end critical section
}
return 0;
}
int main(int argc, char *argv[])
{
if(argc<2)
{
ACE_OS::printf("Usage: %s <number_of_threads> <num_of_iterations>\n",argv[0]);
ACE_OS::exit(1);
}
args arg;
//setup the arguments
int n_threads= ACE_OS::atoi(argv[1]);
ACE_thread_t *threadID=new ACE_thread_t[n_threads+1]; ///DWORD
ACE_hthread_t *threadHandles=new ACE_hthread_t[n_threads+1]; ///HANDLE
if(ACE_Thread::spawn_n(threadID, id's for each of the threads
n_threads, number of threads to spawn
(ACE_THR_FUNC)worker, ///entry point for new thread
&arg, args to worker
THR_JOINABLE | THR_NEW_LWP, //flags
ACE_DEFAULT_THREAD_PRIORITY,
0,0,threadHandles)==-1)
{
ACE_DEBUG((LM_DEBUG,"Error in spawning thread\n"));
}
for(int i=0; i<n_threads; i++)
ACE_Thread::join(threadHandles[i]);
return 0;
}