В моей программе есть цикл событий, дисциплинированный epoll
(для ввода-вывода) и переменные условия (для другой активности сообщения), а также рабочий поток, ответственный за сигналы улавливания (SIGINT
, SIGTERM
, SIGHUP
). SIGINT
, SIGTERM
, SIGHUP
и SIGPIPE
заблокированы во всех других потоках.Как я могу прерывать бесконечную sigtimedwait?
Мои epoll_wait
вызовы имеют 500мс тайм-аут, но я пытаюсь уменьшить переключение контекста и использовать бесконечное epoll_wait
вместо разбужен активности трубы, когда основной поток решает, что пришло время, чтобы выйти из программы и цикл событий должен быть остановлен.
Аналогично, мой вызов sigtimedwait
имеет тайм-аут 500 мс (и проверяет std::atomic<bool>
после каждого вызова, чтобы посмотреть, нужно ли ему останавливаться), и я хотел бы заменить его тем, что не нужно продолжать проверьте прерывание.
Могу ли я поднять сигнал от основного потока к потоку наблюдения за сигналом, чтобы достичь этого, или что-то в этом роде? Или есть лучший способ поймать сигналы в этот день и в возрасте?
Это на CentOS 6 и 7 (хотя общее решение POSIX было бы предпочтительным — бонусных очков для простого стандарта C++ 11!).
Возможно, это должно быть на [softwareengineering.se]? –
Что такое платформа, Linux? –
@SamVarshavchik: К сожалению, да –