2011-04-17 121 views
1

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

试想:

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;),并
    一个)向下转换从IA至A(或从IB至乙分别地),并使用它
    b)中,使其静态的,并调用A::m_cs(或B::m_cs

  2. 更好 - CR eate附加singletonish对象/结构,将管理对象CRITICAL_SECTION并提供给它的访问:不幸的是

    class CriticalSectionProvider { 
        //(...) 
    public: 
        static critical_section& GetIt() { static critical_section cs; return cs; } 
    } 
    

,我不快乐与任何这些,认为有人可能有更好的主意。

如何在这种情况下共享两个类之间的单个临界区?

+3

提取*受保护的资源*出自己的对象,然后将critsect那里。 – Erik 2011-04-17 20:21:11

回答

1

最简单的方法是:创建之间要共享对象的任何线程之前创建的主()critical_section一个实例。

它传递给类的构造函数,并将其保存为参考

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 
} 
相关问题