2017-10-12 131 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這個成員變量? –