У меня есть многопоточное приложение для Linux, которое требуется для плавного завершения в ответ на SIGTERM
.
В способе, которым оно в настоящее время реализовано, используется std::promise<void>
и соответствующее будущее: основной поток сначала устанавливает простой *Обработчик 1005 *, который устанавливает обещание и возвращает, затем запускает все вспомогательные потоки и ожидает в будущем.Когда SIGTERM
получено, обработчик устанавливает обещание.Это разблокирует основной поток, который управляет упорядоченным отключением вспомогательных потоков, а затем завершает работу.
Все это работает нормально - но, насколько я могу судить, на самом деле нет никаких гарантий, что безопасно использовать std::promise::set_value()
(илив этом отношении любой другой механизм синхронизации C ++ 11) в обработчике сигналов.
Это на самом деле рискованно на практике?Должен ли я заменить это, например, sem_post
или каким-либо другим механизмом, явно описанным как безопасный?