2013-03-08 165 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