在fork之后删除condition_variable时,boost崩溃
boost crash when deleting condition_variable after fork
我有一个共享库,可以用我的应用程序加载。加载库时,它会创建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命令吗?
相关文章:
- 程序崩溃使用boost::asio
- 如果使用 /MTd,则在 boost::interprocess::shared_memory_object 中崩溃
- 磁盘已满时,Boost日志崩溃
- Boost::log只在debian中崩溃
- 当过程崩溃时,如何发布boost :: intercess :: ness_mutex
- boost :: container :: flat_multimap在OSX/Appleclang上以发行模式崩溃
- Boost.PropertyTree 在迭代一些空树时崩溃
- Boost Asio - boost::bind 导致程序崩溃
- 当STDERR重定向到管道时,为什么BOOST ::流程在Windows上崩溃
- BOOST :: ASIO使用成员受体而不是新成员时崩溃
- 与boost::property_tree XML解析器一起使用时,boost::协同程序库崩溃
- 使用无效套接字调用boost::asio::write()使我的Blackberry 10应用程序崩溃
- Boost Asio,异步 UDP 客户端 - 关机时崩溃
- Boost 测试在使用 Clang 4.1 (LLVM 3.1svn) 退出时崩溃
- 使用boost::timed_join和FreeLibrary时崩溃
- boost::asio 中的未经请求的消息使应用程序崩溃,没有 SSL 它可以正常工作,为什么
- Boost.SSpirit.Qi在将规则分配给包括自身在内的序列时崩溃
- 在fork之后删除condition_variable时,boost崩溃
- 从 boost::p ython::exec( 任何内容)调用时崩溃
- Boost.Coroutine在iPhone上崩溃