1

このコードにリンクするすべての人の間で単一の「神」インスタンスを共有し、共有オブジェクトに配置することは可能ですか?

god* _god = NULL;
extern "C" 
{

int set_log_level(int level)
{
    if(_god == NULL) return -1;
    _stb->log_level(level);
    return 0;
}

int god_init(){
    if(_god == NULL){
        _god = new god(); //Magic happens here
    }
}

}

すべての関数の開始時にロック同期を実行し、神自身が他のものを新規作成/mallocできることを考えると、それらのものは決して呼び出し元に返されることはありません(神は内部使用のためだけにmallocします)、最も単純なものは何ですかできればその方法。

この共有ライブラリにリンクされた任意の数のプログラムにどのように拡張できますか?

4

3 に答える 3

2

Boost Interprocessライブラリには、高レベルの移植可能な共有メモリ オブジェクトがあります。

于 2008-11-11T15:50:20.460 に答える
1

これはまったく正しいアプローチではありません。あなたが提案したことを行うことにより、変数は、はい、ライブラリに対してグローバルになり、したがってプログラムに対してグローバルになりますが、データは実際に実行中のプロセスに対してプライベートです。実行中のプログラム間で値を共有することはできません。@grieve は、複数のスレッドによってアクセスされるグローバルを参照していますが、スレッドは同じ親プロセス インスタンスを共有しています。

実際のプロセス全体で、OS 固有の共有メモリ機能にブレークアウトする必要があります。詳細については、共有メモリを参照してください。これは実行可能な問題ですが、実行するのは特に簡単ではありません。使用方法を調整するために、セマフォのようなプロセス間同期システムも必要です。

于 2008-11-11T15:19:03.643 に答える
0

I have feeling that god will be a server of some kind. Consider using a proper client/server architecture, so as to keep god away from the masses.

于 2008-11-11T15:41:17.717 に答える