#c #c #linux #pthreads
Вопрос:
В Linux, как генерировать событие для прерывания цикла select / poll / epoll при завершении потока? Процессы имеют pidfd
и SIGCHILD
. Есть ли что-то подобное для потоков?
Изменить: это делается для непосредственного мониторинга события завершения потока.
Ответ №1:
Ну, самое очевидное решение, которое приходит на ум, заключается в том, что один из опрашиваемых/выбранных файловых дескрипторов будет очень специальным файловым дескриптором, зарезервированным для этой конкретной цели. Когда вы хотите «вырваться» из select/poll/epoll, вам просто нужно принять соответствующие меры для того, чтобы этот совершенно особый файловый дескриптор стал доступным для чтения, и это произойдет.
После возврата select/poll/epoll вы проверите этот файловый дескриптор, как и любой другой, и действуйте в соответствии с тем, что должно произойти в этом случае. Таким образом, единственная оставшаяся часть этого вопроса заключается в том, что это будет за совершенно особый файловый дескриптор?
Что ж, поскольку вы отметили свой вопрос linux
, у вас есть много вариантов для Linux на выбор.
Вы можете отключить собственную обработку сигналов в своем процессе и создать дескриптор файла сигнала. Затем отправленный процессу сигнал преобразуется в дескриптор файла сигнала, который становится доступным для чтения, и чтение из него, как описано на странице руководства, сообщает вам, что сигнал принят.
Другим вариантом может быть дескриптор файла событий, который больше подходит для разных потоков в одном и том же процессе, уведомляющих друг друга.
Как дескрипторы файлов событий, так и сигналов в высшей степени доступны для опроса/выбора. И всегда есть подход старой школы , заключающийся в создании pipe()
, выборе/опросе конца канала для чтения и записи на конец канала для записи, чтобы получить уведомление.
Комментарии:
1. Есть также pidfd.
2. Я должен извиниться. Я забыл слово «при завершении потока» в своем вопросе
3. Ну, а что значит «при завершении потока»? Если поток завершен, он по определению не может находиться ни в одном цикле выбора/опроса. В любом случае, завершение потока не происходит случайным образом. Единственный способ завершить поток-это вернуться из функции потока или создать исключение. Обе эти возможности легко контролируются, поэтому вы можете делать все, что захотите, до того, как поток вернется из своей функции потока, и обернуть все/в блок try/catch, чтобы перехватить исключения, которые завершат поток.