ライブラリを実装しています。変更できるのはファイル、、だけで、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()
- これを解決する別の方法はありますか?
ありがとう!