2017-10-12 135 views
0

有一个模板类模板类的typedef

template <ACE_SYNCH_DECL, class TIME_POLICY = ACE_System_Time_Policy> 
class ACE_Task : public ACE_Task_Base 

和ACE_SYNCH_DECL可以

class ACE_Export ACE_NULL_SYNCH 
{ 
public: 
    typedef ACE_Null_Mutex MUTEX; 
    typedef ACE_Null_Mutex NULL_MUTEX; 
    typedef ACE_Null_Mutex PROCESS_MUTEX; 
    typedef ACE_Null_Mutex RECURSIVE_MUTEX; 
    typedef ACE_Null_Mutex RW_MUTEX; 
    typedef ACE_Null_Condition CONDITION; 
    typedef ACE_Null_Condition RECURSIVE_CONDITION; 
    typedef ACE_Null_Semaphore SEMAPHORE; 
    typedef ACE_Null_Mutex NULL_SEMAPHORE; 
}; 

class ACE_Export ACE_MT_SYNCH 
{ 
public: 
    typedef ACE_Thread_Mutex MUTEX; 
    typedef ACE_Null_Mutex NULL_MUTEX; 
    typedef ACE_Process_Mutex PROCESS_MUTEX; 
    typedef ACE_Recursive_Thread_Mutex RECURSIVE_MUTEX; 
    typedef ACE_RW_Thread_Mutex RW_MUTEX; 
    typedef ACE_Condition_Thread_Mutex CONDITION; 
    typedef ACE_Condition_Recursive_Thread_Mutex RECURSIVE_CONDITION; 
    typedef ACE_Thread_Semaphore SEMAPHORE; 
    typedef ACE_Null_Semaphore NULL_SEMAPHORE; 
}; 

但ACE_SYNCH_DECL不ACE_Task使用,因此如何这些typedef是否工作?

回答

1

当您实例化ACE_Task时,ACE_SYNCH_DECL参数将替换为ACE_MT_SYNCH或ACE_NULL_SYNCH之一,具体取决于您是否想要ACE_Task类中的同步队列。

如果仅在一个线程中使用ACE_Task,则不需要队列同步开销,并且可以使用ACE_NULL_SYNCH。但是,如果它将从多个线程使用,请使用ACE_MT_SYNCH。

有ACE_NULL_SYNCH的在测试的示例/ Message_Queue_Test.cpp

顺便说一句,这是在更详细的在C++NPv2部分6.2和6.3说明。

+0

Thanks.And大多数我想知道的是,像MUTEX或PROCESS_MUTEX这样的参数是如何工作的。例如,当使用ACE_MT_SYNCH实例化ACE_Task时,是否包含该ACE_Task实例中的“typedef ACE_Thread_Mutex MUTEX”?我们怎样才能像MUTEX那样使用ACE_MT_SYNCH这个成员变量? –