2

(共有)ライブラリを介していくつかの関数を呼び出さなければならないプログラムを作成しようとしています(そのソースは利用可能です)。ライブラリのCコードにはいくつかのグローバル変数があり、多くの関数がこれらのグローバル変数の値を変更します。私がプログラムでしなければならないことは、私が行う各関数呼び出しが新しい変数のセットで機能するようになることを必要とします。

たとえば、この関数をライブラリの一部とします。

int x = 1;

int foo()  
{  
    int a = 0;
    //do somethings to 'a'
    //...
    x++;
    return a;
}  

これで、プログラムから呼び出すたびにfoo()、の値がx1から2、3、4のように更新されます...foo()呼び出されるたびにx=1と表示されるようにプログラムを作成しようとしています。

申し訳ありませんが、C / linuxがこれらの可変スペースをどのように処理するかについての知識が不十分であるため、この質問はあいまいに思えるかもしれません。上記はほんの一例です。実際には、手動で値をリセットすることは事実上不可能な非常に多くの変数があります。

そのライブラリをコンパイルしたり、プログラムで使用して変数を更新したりするための最良の方法は何でしょうか。

(ちなみに、私もやろうとしているのはfoo()の呼び出しを並列化することですが、共有変数のため、それはできません。)

編集:いくつかのWeb開発プロジェクトで作業しているとき、私はいくつかのコードをWebサービスにカプセル化し、メインプログラムからそれらのサービスを呼び出すために使用しました。同様のフレームワークがC/Linuxに存在しますか?関数がデータを返すことに注意してください。

4

2 に答える 2

3

グローバル変数(または一般にグローバル状態)が本当に悪い考えである主な理由の1つを発見しました。

ソースにアクセスできるので、ソースコードをリファクタリングするために時間をかけることをお勧めします。

次の戦略を使用して、fooへの呼び出しを並列化する機能を実現できます。

  • すべてのグローバル変数を1つの構造体にまとめます。Contextのようなものと呼んでください。
  • グローバル変数に作用する各関数を変更してコンテキストへのポインターを取得し、グローバル変数を更新する代わりにコンテキスト内の変数を更新するように関数を変更します。
  • これで、ライブラリを使用する各スレッドが新しいコンテキストを作成し、それをfooおよび関連する関数に渡すことができます。

ソースコードにこのような変更を加えることが不可能な場合は、子プロセスを開始することで複数のCPUコアを使用できます。各子プロセスには、独自のメモリスペースがあります。このオプションは、複数のスレッドを使用するほど効率的ではありません。

于 2012-07-19T18:50:22.787 に答える
0

詳細はわかりません。ただし、次のいずれかを試すことができます。

  1. ライブラリのアンロードとロード
  2. ライブラリの.bssをクリアし、.dataセクションにライブラリの値を入力してみてください(dl_iterate_phdr()呼び出しを参照)。
于 2012-07-19T19:16:41.550 に答える