0

ライブラリを実装しています。変更できるのはファイル、、だけで、mylib.c別のファイル内のファイルは変更できmylib.hませんmain()

main()内のプロセスが呼び出すと、関数のmylib_init()使用を開始できmylib.h, mylib.cます。

プロセスが呼び出すとmylib_exit()、彼は関数を使用できなくなりますmylib.h, mylib.c

mylib現在ライブラリを使用しているプロセスの数を数えたいので、中mylib_init()には

pthread_atfork(my_prepare_fork, NULL, NULL);

my_prepare_fork() {
    p_using_mylib ++;
}

p_using_mylib共有メモリによって実装され、セマフォと含まれるべきすべてのものがあります...)

次の発生で問題が発生しました:

特定のmain()関数の擬似コード:

  1. 父は電話しますmylib_init()
  2. 父は電話しますmylib_exit()
  3. 父はmylib_init()//2回目に電話します
  4. 父はするfork()

mylib_init()2回呼び出されるため、2回pthread_atfork()呼び出されるため、現在はで呼び出されるためfork()、関数my_prepare_fork()は2回呼び出されます。=>の数p_using_mylibが正しくなくなり、これが問題になります。

だから私は知りたかった:

  1. 以前の登録を解除する方法はありますpthread_atfork()か?
  2. メインプロセスが初めて生まれたときだけ、関数を登録する方法はありますか?そのような状況では、私はこの関数に初期化を入れることができますpthread_atfork()
  3. これを解決する別の方法はありますか?

ありがとう!

4

1 に答える 1

1

関数を「登録解除」する方法はありませんpthread_atforkpthread_onceすべての初期化タイプのルーチンが複数回実行されないように保護するためにを使用する必要があります。

于 2013-03-08T03:28:50.393 に答える