【问题标题】:template class and typedef模板类和 typedef
【发布时间】:2017-10-12 09:53:42
【问题描述】:

有一个模板类

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_Task中没有用到ACE_SYNCH_DECL,那么这些typedef是如何工作的呢?

【问题讨论】:

    标签: c++ ace


    【解决方案1】:

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

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

    tests/Message_Queue_Test.cpp中有一个ACE_NULL_SYNCH的例子

    顺便说一句,这在C++NPv2 第 6.2 和 6.3 节中有更详细的解释。

    【讨论】:

    • 谢谢。我最想知道的是像 MUTEX 或 PROCESS_MUTEX 这样的参数是如何工作的。例如,当使用 ACE_MT_SYNCH 实例化 ACE_Task 时,该 ACE_Task 实例中是否包含“typedef ACE_Thread_Mutex MUTEX”? ACE_MT_SYNCH的这个成员变量如何像MUTEX一样使用?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-23
    • 2011-10-17
    • 1970-01-01
    相关资源
    最近更新 更多