1

異なるクラス階層の 2 つのクラス間で同じクリティカル セクション オブジェクトを共有するという問題に対して、適切な設計ソリューションを見つけるのに苦労しています。

想像:

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. 悪いcritical_section m_cs;- A または B のいずれかの適切なメンバー ( ) を作成し、
    a) IA から A (または IB から B にそれぞれ) にダウンキャストし、それを使用します
    b) 静的にし、呼び出しますA::m_cs(またはB::m_cs)

  2. BETTER - critical_section オブジェクトを管理し、それへのアクセスを提供する追加のシングルトン オブジェクト/構造体を作成します。

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

残念ながら、私はこれらのどれにも満足しておらず、誰かがより良いアイデアを持っていると思います.

この場合、2 つのクラス間で単一のクリティカル セクションを共有する方法は?

4

1 に答える 1

2

最も簡単な方法はcritical_section、オブジェクトを共有するスレッドを作成する前に、main() で のインスタンスを作成することです。

それをクラスのコンストラクターに渡し、参照として保存します。

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
}
于 2011-04-17T20:23:23.810 に答える