2013-03-08 209 views
0

我正在實現一個庫。我只能修改文件mylib.cmylib.h,而不是其他文件中的main()pthread_atfork()多次調用導致fork()函數被多次調用後

當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() //第二次
  4. 父親做fork()

因爲mylib_init()調用了兩次,pthread_atfork()也調用了兩次,並且因爲那現在在fork(),函數my_prepare_fork()被調用兩次。 =>p_using_mylib的號碼將不正確,這是問題所在。

所以我想知道:

  1. 有什麼辦法來註銷pthread_atfork()那是以前?
  2. 是否有任何註冊函數的方法,僅在主進程第一次出現?在這樣的情況下,我可以通過這個函數初始化pthread_atfork()
  3. 有沒有另一種方法可以解決這個問題?

謝謝!

+0

爲什麼不在'mylib_exit()'中減少'p_using_mylib'? – alk 2013-03-08 07:19:40

+0

原因當進程停止使用帶有mylib_exit()的庫時,應該減量,而不是在進程死亡時(他可以活着,不使用庫 - 我應該看到使用庫的'0'進程) – hudac 2013-03-08 09:21:34

回答

1

沒有辦法「取消註冊」pthread_atfork功能。您應該使用pthread_once來保護所有初始化類型的例程不會多次運行。

+0

太好了,謝謝! – hudac 2013-03-08 10:31:14