ひどいタイトル、私は知っていますが、(今のところ)私はもっと良いものを思い付くことができません
次のようなクラスのインスタンスであるいくつかのオブジェクトがあるとします。
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
(参照カウンターを減らすため)、次に実行しますCreate
(Create
が実行されている場合、mUSTDestroy
の参照カウンターはConnection
1でなければなりません(静的ポインターのみがNULL以外である必要があります))。
どうすればこれを可能にすることができますか?
デザインが悪く、「ローカライズされすぎている」ように聞こえます。私は、最初に呼び出すデザインMyWorker
と事実を変更することはできません。誰かがより良いアイデアを持っているなら、私はのデザインを少し変えることができます。Reconnect
DoDisconnect
ConnectioFactory
mutex
現在、へのアクセスを同期するためにスタティックをロックしていますm_ptrConnection
。が他のスレッドによってすでに再初期化されているCreate
場合は、単に戻ります。
唯一の問題は、すべてのスレッドが最初に実行されたことを確認する方法です。どういうわけか秒を使用しますか?または、静的なスレッドセーフ(アトミック)カウンターですか?m_ptrConnection
MyWorker
DoDisconnect
mutex