在fork之后删除condition_variable时,boost崩溃

boost crash when deleting condition_variable after fork

本文关键字:boost 崩溃 variable fork 之后 删除 condition      更新时间:2023-10-16

我有一个共享库,可以用我的应用程序加载。加载库时,它会创建boost::condition_variable的实例。并在其存在时将其删除(使用at_exit())。

我的应用程序调用fork()。看起来,当子进程结束时,库试图删除condition_variable,但断言失败。

我认为这与fork有关,因为只有子进程(只有在父进程结束后才终止)会导致崩溃。

有人知道为什么会发生这种事吗?有人知道如何解决它吗?

崩溃:

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

发生这种情况似乎是因为您分叉()但不执行(),这给您留下了两个进程,每个进程都注册了atexit处理程序。为了克服这一点,可以考虑简单地添加一个全局bool(每个进程一个),在采取任何操作之前,atexit处理程序将对其进行检查。然后,只需在子进程中设置bool,使其处理程序不执行任何操作。

有关更多信息,请参阅:我可以撤消或删除atexit命令吗?