Страницы

Поиск по вопросам

пятница, 12 июля 2019 г.

Нереентерабельные функции в обработчиках сигналов

Всем добрый вечер! Есть задача освобождения ресурсов, используемых дочерними потоками, после их завершения. Меня очень просили реализовать данную операцию асинхронно, но, насколько я понимаю, функция free(), как и malloc(), не является реентерабельной и не рекомендуется к использованию в обработчиках сигналов. Я пока что вижу 2 пути : выставлять флаг в обработчике сигналов, проверять его в основном потоке и освобождать память там, блокировать сигнал перед каждым обращением к free() во всех потоках. Если кто знает более интересные варианты решения, поделитесь пожалуста. Некоторые уточнения : в основном потоке выполнения для каждого дочернего потока создается структура данных, она помещается в список, ее указатель передается дочернему потоку. По завершении дочернего потока необходимо удалить структуру из списка и освободить из-под нее память. Можно было бы делать это прямо в дочернем потоке, но, насколько я понимаю, хорошим тоном считается освобождение памяти, выделенной для дочернего потока, в основном потоке, где она и выделялась. Так как основной поток нагружен другой полезной работой, была озвучена просьба не ждать в нем завершения дочерних потоков, а обрабатывать их завершение асинхронно, в обработчике сигнала, вследствие чего я посылаю SIGUSR1 по завершении дочернего потока.


Ответ

@margosh, лимит комментариев у меня подошел к концу, поэтому переключаюсь на "ответ". Не нравится мне идея делать free() в обработчике. Более того, я не понимаю, как Вы узнаете по получению SIGUSR1 что именно освобождать. В подобной задаче (при Ваших условиях) я сделал бы что-то в таком духе: Создал pipe, который разделяют все потоки. Создал поток, читающий этот pipe и освобождающий память. Перед завершением потока (вместо SIGUSR1) писал в pipe, что освобождать. Собственно как-то так. Без сигналов и асинхронно к основному циклу обработки. Если отбросить "правила хорошего тона", то проще всего (хотя я не знаю ряда тонкостей Вашей задачи) освобождать ресурсы в завершающемся потоке.

Комментариев нет:

Отправить комментарий