pthread_atfork()在fork()函数被多次调用后多次调用

时间:2013-03-08 01:19:51

标签: c linux pthreads

我正在实施一个库。我只能修改文件mylib.cmylib.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() //
  4. 父亲fork()
  5. 由于mylib_init()调用了两次,pthread_atfork()也调用了两次,因此现在fork(),函数my_prepare_fork()被调用两次。 => p_using_mylib的数量不正确,这就是问题所在。

    所以我想知道:

    1. 有没有办法取消注册之前的pthread_atfork()
    2. 是否有任何注册功能的方法,只有第一次出现主要流程?在这种情况下,我可以在此函数中放入pthread_atfork()
    3. 的初始化
    4. 还有另一种解决方法吗?
    5. 谢谢!

1 个答案:

答案 0 :(得分:1)

无法“取消注册”pthread_atfork个功能。您应该使用pthread_once来保护所有初始化类型的例程不会被多次运行。