質問

製品に使用しているライブラリの 1 つは、アクセスにシングルトンを使用しています。静的インスタンスとして実装されていると確信しています (オープンソースではありません)。これは単一のドキュメント アプリケーションではうまく機能しますが、アプリには複数のドキュメントが読み込まれている可能性があります。インスタンスへのアクセスは次のように書かれていると仮定します。

Instance* getInstance() {
    static Instance* inst = new Instance();
    return inst;
}

このような状況では、複数のインスタンスを堅牢に作成する方法はありますか?私が考えることができる唯一のことは、プロセス以上のものを用意し、何らかのタイプの IPC を使用してすべてを結び付けることです。これ以上ハックなものは思いつきません。

複数のインスタンスを同時に実行できるように、ある種のセッション トークンを実装するようベンダーに依頼しましたが、それらは大規模であり、私たちは小規模です。

コーリー

編集:

  • マシンは Windows マシンです
  • グローバル スタティックは基本的に大きな工場です。「このセッションからすべてのリソースを解放する」と簡単に言えるように、何らかのタイプのセッション トークンが必要です (私が知っているグローバル静的データを再初期化する方法はありません)。

必要なものを取得するために危険ないたずらを試すのではなく、全体を独自のクラスでラップし、すべてのゲッターにセッション キーを追加します。内部的には、割り当てられた内容を追跡し、リソースを返す独自のリリース メソッドを追加します。これは多くの理由から最適ではありませんが、これより良いアイデアは思いつきません。

素晴らしいフィードバックをくださった皆さんに感謝します。

役に立ちましたか?

解決

あなたのように定義さシングルトンクラスを持つには十分に幸運であれば、私は考えることができる唯一のことは、サブクラスそれにあります:

class Document {
public:
    static Document* getInstance() {
        static Document inst;
        return &inst;
    }
    virtual ~Document();
protected:
    Document();
private:
    struct Impl;
    Impl *pImpl;
};

あなたがそれをサブクラス化することができますし、サブクラスはコンストラクタにアクセスする必要があります場合は、あなたが作成することができます。のinstanceable のようなサブクラスます:

class MyDocument: public Document {
public:
    MyDocument(): Document() {
    }
};
実装者は、いくつかの厄介な仮定を行っている可能性があるため、

これは完全に安全ではないかもしれません。しかし、それはアイデアや作業のいくつかのチャンスがあるかもしれないいくつかのアプローチがあります。あなたはそれを言及場合は運が良ければベンダーは、このオプションの影響を受けやすいかもしれません...幸運ます。

他のヒント

あなたはインプロセスすべてが起こる有しながら、この特定の問題を解決することができたとしても、私はこのシングルトン問題は氷山の一角であることを心配されるだろう。ライブラリは、明らかに自分のシナリオのために設計されていませんでした。

、独自のプロセスにDLLの各負荷を分離することで、もちろん、それはあなたのために高価になる可能性がありますが、右と私に非ハック鳴ります。

私は、残念ながらあなたの推論に欠陥を見ることができません。ベンダーは、意思決定をした、とあなたはそれに縛られています。彼は、プロセスごとに1つのインスタンス上で決定しましたので、あなたは、複数のインスタンスをしたい場合、あなたは必要とするすべてで複数のプロセスを持っている必要があります。

もちろん、あなたが制限する彼の決定は任意であり、そしてそれのための正当な理由がないことを、あなたはそれを回避ハッキングを試みることができると仮定した場合。そのパス上で起動する方法は、デバッガでいくつかの分解/組立ステッピングを行うことです。あなたは彼のインスタンスの工場が正確に動作していることを確認できた場合は、上記締結しているとして、あなたは間違いなく、複数のインスタンスを作成することができます代替手段を一緒にハックしない可能性があります。

しかし、もちろんこのアプローチの巨大なリスクは、単一のインスタンスを持っている彼の決定に依存しているベンダーのコードベースのコードのすべての行は、あなたの顔に爆破して、その後timebombの準備ができているということです。このコードは、あなたには見えません。あなたはゼロ、そのような行がある賭けることを準備していますか?私は、クリント・イーストウッドがこのような状況で言うものを知っています。 「yaがうまく屋を行い、ラッキーパンクを感じますか?」 : - )

があり、一つのプログラム空間のシングルトンオブジェクトのインスタンスを複数持っている何のエレガントな方法はありません - それは目的です。一般的に、あなたは複数のインスタンスを持つことが望ましくない場合には、シングルトンを使用しています。ベンダーは、シングルトンを使用して自社製品を実装している場合、選択のための正当な理由があるかもしれません。

あなたは、より詳細に問題を記述する場合は、

おそらく、可能な他のアプローチがあるかもしれません。提供された情報に基づいて、言い難いです。シングルトンオブジェクトは、何をしますか?なぜあなたはそれの複数のインスタンスが必要なのでしょうか?

あなたが示唆したプロセス間のもの、私は新しいファイルにdllファイルをコピーし、手動で新しいDLLをロードし、あなたが作成し、各インスタンスのために使用するすべての関数をインポートされて思い付くことができる最高のハックを除きます。

うまくいけば、これは、彼らが同じDLLには技術的にはありませんので、静的変数が異なるインスタンス間で競合しないことを意味します。しかし、このような各バージョンのためにクローニングされ、あなたがインポートライブラリを使用することができますが、DLLをロードして、手動ですべての関数をインポートする必要はありません、DLL内のすべてのコードのように、このソリューションで悪いことの多くは、あります。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top