0

ひどいタイトル、私は知っていますが、(今のところ)私はもっと良いものを思い付くことができません


次のようなクラスのインスタンスであるいくつかのオブジェクトがあるとします。

class MyWorker: public Thread
{
public:
    void Reconnect(...);
    //...
private:
    void DoDisconnect();
    ConnectionPtr m_ptrConnection;
};

これらの各オブジェクトは個別のスレッドです。ConnectionPtrスマートポインタをカウントする参照です。

Reconnect最初にを実行DoDisconnectします。これm_ptrConnectionは(参照カウンターを減らすために)無効にし、次に実行しConnectionFactory::Createます。

class ConnectionFactory
{
private:
    ConnectionFactory();

public:
    ConnectionPtr Create( ... );

private:
    //...
    void Destroy();
    static m_mutex;
    static ConnectionPtr m_ptrConnection;
};

ここで、をCreate( ... )呼び出しDestroy()、その後、m_ptrConnectionメンバーを再初期化し、結果として返します。

アイデアは、のすべてのインスタンスがMyWorker同じものを使用するということですConnection(これが実際に何であるかは重要ではありません)。

問題は次のとおりですMyWorker。MUSTのすべてのインスタンスは、最初に呼び出しDoDisconnect(参照カウンターを減らすため)、次に実行しますCreateCreateが実行されている場合、mUSTDestroyの参照カウンターはConnection1でなければなりません(静的ポインターのみがNULL以外である必要があります))。

どうすればこれを可能にすることができますか?

デザインが悪く、「ローカライズされすぎている」ように聞こえます。私は、最初に呼び出すデザインMyWorkerと事実を変更することはできません。誰かがより良いアイデアを持っているなら、私はのデザインを少し変えることができます。ReconnectDoDisconnectConnectioFactory


mutex現在、へのアクセスを同期するためにスタティックをロックしていますm_ptrConnection。が他のスレッドによってすでに再初期化されているCreate場合は、単に戻ります。 唯一の問題は、すべてのスレッドが最初に実行されたことを確認する方法です。どういうわけか秒を使用しますか?または、静的なスレッドセーフ(アトミック)カウンターですか?m_ptrConnection
MyWorkerDoDisconnectmutex

4

1 に答える 1

1

【質問のコメントより】

との間にスレッドバリアを挿入して、すべてのスレッドが前に終了したことを確認できます。いくつかのアイデアを得るために、とを使用するブースト実装を見てみましょDoDisConnectDestroyDoDisconnectDestroymutexcondition_variable

于 2012-08-03T09:01:17.407 に答える