0

我正在实现一个库。我只能修改文件mylib.c, mylib.h,而不能修改main()另一个文件中的 which 。

当 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()被调用了两次。=> number ofp_using_mylib将不正确,这就是问题所在。

所以我想知道:

  1. 有什么办法可以取消pthread_atfork()之前的注册吗?
  2. 有什么方法可以注册一个函数,只在第一次生成主进程时?在这种情况下,我可以在这个函数中初始化pthread_atfork()
  3. 还有其他方法可以解决这个问题吗?

谢谢!

4

1 回答 1

1

没有办法“注销”pthread_atfork功能。您应该使用它pthread_once来保护所有初始化类型的例程不被多次运行。

于 2013-03-08T03:28:50.393 回答