在fork之后删除condition_variable时加速崩溃

时间:2013-11-20 11:35:23

标签: c++ linux boost-asio

我有一个共享库,我加载了我的应用程序。 当加载库时,它会创建一个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

1 个答案:

答案 0 :(得分:1)

这似乎正在发生,因为你fork()但不执行exec(),这会留下两个进程,每个进程都注册了atexit处理程序。要解决这个问题,请考虑简单地添加一个全局bool(每个进程一个),它将在执行任何操作之前由atexit处理程序检查。然后,只需在子进程中设置bool,使其处理程序不执行任何操作。

有关详情,请参阅:Can I undo or remove an atexit command?