2011-04-17 55 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 
} 
相關問題