我有一个共享库,我加载了我的应用程序。 当加载库时,它会创建一个boost :: condition_variable的实例。 并在存在时删除它(使用at_exit())。
我的应用调用fork()。并且似乎当子进程结束时,库试图删除condition_variable,并在断言上失败。
我认为它与fork有关,因为只有子进程(仅在父进程结束后才终止)导致崩溃。
有没有人知道为什么会这样? 有没有人知道如何解决它(没有try / catch)?
崩溃:
Missing separate debuginfos, use: debuginfo-install boost-filesystem-1.41.0-11.el6_1.2.x86_64 boost-system-1.41.0-11.el6_1.2.x86_64 glibc-2.12-1.47.el6.x86_64 libgcc-4.4.6-3.el6.x86_64 libstdc++-4.4.6-3.el6.x86_64
(gdb) bt
#0 0x0000003eca232885 in raise () from /lib64/libc.so.6
#1 0x0000003eca234065 in abort () from /lib64/libc.so.6
#2 0x0000003eca22b9fe in __assert_fail_base () from /lib64/libc.so.6
#3 0x0000003eca22bac0 in __assert_fail () from /lib64/libc.so.6
#4 0x00007f64bab101f6 in ?? () at /usr/include/boost/thread/pthread/condition_variable_fwd.hpp:86
答案 0 :(得分:1)
这似乎正在发生,因为你fork()但不执行exec(),这会留下两个进程,每个进程都注册了atexit处理程序。要解决这个问题,请考虑简单地添加一个全局bool(每个进程一个),它将在执行任何操作之前由atexit处理程序检查。然后,只需在子进程中设置bool,使其处理程序不执行任何操作。