2012-03-13 6 views
2

namespace fooには、非常に静的なデータ、名前空間 - グローバルデータ、シングルトンなどがたくさんある(かなり大きい)C++モジュールが無数のファイルやディレクトリに広がっているとします。独立したバージョンを(同じプロセスで)実行するためには、その全体を「サンドボックス」する方法はありますか?実行されるバージョンの数は、実行時に決定されます。静的データを使用する名前空間をサンドボックスすることはできますか?

私はいくつかの名前空間(例:bar1::foobar2::foo、...)ですべてをラップすることを考えましたが、それはa)すべてのファイルに触れたくないのでb)できません。実行時に任意の数を持ちます。


アップデート:バージョンごとに別々のスレッドを作成できると思っていましたが、スレッドに精通しているとは思いません。

+1

でのぞき見を取る:いいえ、私は 'foo'を書いていないとはい、私は静的/シングルトンは悪を知っています。 – bitmask

+0

+1は、サードパーティのCインターフェイスで一度非常によく似た問題を抱えていました。良い解決策が見つかりませんでした(私の解決策には複数のマクロ生成名前空間が含まれていました)。 –

答えて

0

基本的にはあなたが状態で名前空間を作成し、これは悪いです、あなたはそのように、それはクラス

合理的に簡単にそれを変更することができるはずです。このユースケースのためのクラスを使用したいので、あなたは持っていたところ

namespace foo{ 
    int state; 
    int func(); 
} 

foo::func(); 

あなたは、共有オブジェクト内でごfooコードを置くことを検討し

class foo{ 
    int state; 
    int func(); 
}; 

foo foo1; 
foo1.func(); 
+0

いいえ、私はそうではありません、 'foo'は巨大です!したがって、疑問。 – bitmask

+0

しかし、あなたが記述している問題は、クラスのユースケースと同じです。どうしてクラスを使用できないのですか? – 111111

+1

@bitmask名前空間とクラスは非常に似ていますが、fooが巨大で複数のコピーを持っていても、クラスを複製することができます。クラスと全く同じです。多分それはあなたが問題を解決するのを助けるでしょう。 – 111111

2

を必要としています。実行時に、その共有オブジェクトを必要なだけ頻繁にロードしたりアンロードしたりすることができます。共有オブジェクトの動的ロードの最初の基準については

、サイドの発言としてhttp://www.yolinux.com/TUTORIALS/LibraryArchives-StaticAndDynamic.html

+0

Hmm。それはうまくいくはずです。 –

+0

残念ながら、 'dlopen'のマンページでは、「同じライブラリにdlopen()を再度ロードすると、同じファイルハンドルが返されます。このアプローチは直接的に機能します。また、 'libld'はシンボリックリンクとハードリンクを認識するのに十分スマートです。しかし、共用オブジェクト・ライブラリーをコピーすることはそのトリックです。それにもかかわらず、この性質上、C++(C++の代わりに)インターフェイスを介して話すことに限定されています。 – bitmask

関連する問題