ライブラリを実装しています。変更できるのはファイル、、だけで、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()関数の擬似コード:
- 父は電話します
mylib_init() - 父は電話します
mylib_exit() - 父は
mylib_init()//2回目に電話します - 父はする
fork()
mylib_init()2回呼び出されるため、2回pthread_atfork()呼び出されるため、現在はで呼び出されるためfork()、関数my_prepare_fork()は2回呼び出されます。=>の数p_using_mylibが正しくなくなり、これが問題になります。
だから私は知りたかった:
- 以前の登録を解除する方法はあります
pthread_atfork()か? - メインプロセスが初めて生まれたときだけ、関数を登録する方法はありますか?そのような状況では、私はこの関数に初期化を入れることができます
pthread_atfork() - これを解決する別の方法はありますか?
ありがとう!