如何在两个类之间共享单个关键部分

时间:2011-04-17 20:13:32

标签: c++ critical-section

我在为不同类层次结构中的两个类之间共享相同关键部分对象的问题找到正确的设计解决方案时遇到了一些麻烦。

想象

class IB;
class IA { 
    public: void method_one(); 
};
class A : public IA { 
    IB* m_ib; 
};

class IB { 
    public: void method_two(); 
};
class B : public IB { 
    IA* m_ia; 
};

现在,应该同步对method_one()和method_two()的调用。我碰巧使用了critical_section对象进行同步,但我想知道该怎么做。

我设法找出了一些想法:

  1. BAD - 创建A或B的合适成员(critical_section m_cs;) a)从IA向A(或从IB到B)的向下倾斜,并使用它 b)将其设为静态,然后拨打A::m_cs(或B::m_cs

  2. 更好 - 创建额外的单一对象/结构,管理critical_section对象并提供对它的访问:

    class CriticalSectionProvider {
        //(...)
    public: 
        static critical_section& GetIt() { static critical_section cs; return cs; }
    }
    
  3. 不幸的是,我对这些中的任何一个都不满意,并认为有人可能有更好的想法。

    在这种情况下,如何在两个班级之间共享单个关键部分?

1 个答案:

答案 0 :(得分:2)

最简单的方法是:在创建要共享对象的任何线程之前,在main()中创建critical_section的实例。

将其传递给类的构造函数并将其存储为 reference

class A : public IA { 
    IB* m_ib; 
    critical_section & m_cs; //reference
    public:
           A(critical_section & cs) : m_cs(cs) {}
};

class B : public IB { 
    IA* m_ia; 
    critical_section & m_cs; //reference
    public:
           B(critical_section & cs) : m_cs(cs) {}
};

int main()
{
    critical_section cs = /*create it*/;

    A a = cs; //call the constructor, passing the reference
    B b = cs; //call the constructor, passing the reference
}