ускорение сбоя при удалении condition_variable после форка

0

У меня есть общая библиотека, которую я загружаю с помощью своего приложения. Когда библиотека загружается, создается экземпляр boost :: condition_variable. и удаляет его, когда он существует (используя at_exit()).

Мое приложение вызывает fork(). и кажется, что, когда заканчивается дочерний процесс, библиотека пытается удалить условие_вариабеля и терпит неудачу в assert.

Я думаю, что это связано с вилкой, потому что единственный дочерний процесс (который заканчивается только после завершения родительского процесса), вызывающий крах.

Кто-нибудь знает, почему это происходит? Кто-нибудь знает, как его решить (без 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
Теги:
boost-asio

1 ответ

1

Кажется, это происходит потому, что вы fork(), но не exec(), который оставляет вас с двумя процессами, каждый из которых имеет зарегистрированный обработчик atexit. Чтобы преодолеть это, попробуйте просто добавить глобальный bool (который будет один на каждый процесс), который будет проверяться обработчиком atexit, прежде чем предпринимать какие-либо действия. Затем просто установите этот bool в дочернем процессе, чтобы его обработчик ничего не делал.

Подробнее об этом см. В статье: Можно ли отменить или удалить команду atexit?

Ещё вопросы

Сообщество Overcoder
Наверх
Меню