Определить, заблокирован ли поток
Кто-нибудь знает способ определить, блокирует ли поток в настоящее время? По сути, я хочу проверить, блокирует ли определенный поток (в данном случае на принимающем вызове сокета дейтаграммы AF_UNIX), и отправить ему сигнал на прерывание, если оно есть.
Я работаю над Linux, используя Boost. Это означает, что под ним я использую pthreads. Моя система имеет NPTL.
Я думаю, что ответ "нет", но хочу посмотреть, если я что-то упустил.
2 ответа
Это не легко возможно (это возможно с использованием функциональности, предназначенной для отладчиков, но она не проста, не переносима и не безопасна).
Вы действительно не хотите делать это в любом случае, потому что такое использование будет иметь врожденное состояние расы. Вы можете проверить, блокирует ли поток непосредственно перед тем, как он собирается блокировать (в этом случае вы пропустите его пробуждение), или он может прекратить блокировку сразу после того, как вы обнаружите, что он блокирует.
Обычный метод решения вашей проблемы - это "самодельный трюк":
- Создать трубу с
pipe()
; - Целевой поток вместо блокировки в
recvfrom()
блокирует вpoll()
или жеselect()
, Дескрипторы файлов для мониторинга включают в себя сокет дейтаграммы и конец чтения канала. - Чтобы пробудить целевой поток, другой поток записывает один байт в конец записи канала.
(The recvfrom()
также следует изменить, чтобы использовать MSG_DONTWAIT
флаг, так как мы никогда не хотим блокировать здесь, и всегда блокировать в poll()
/ select()
вместо).
Ответ - нет. Возможно, есть способ сделать это на вашей платформе, но в целом я не знаю, как это сделать.
Теперь, прежде чем погрузиться в документацию вашей платформы нижнего уровня, подумайте дважды, действительно ли это то, что вам нужно:
Поток всегда заблокирован по причине. Например, он может быть заблокирован в FILE IO. Это может быть безопасно прервано, если вы правильно обработаете возвращаемые значения. С другой стороны, поток также может быть заблокирован в вызове new / delete или другой стандартной библиотечной функции. Прерывание потока в библиотеке времени выполнения - это квитанция об аварии.
Я знаю, что у вас есть причина спросить здесь, но имхо, лучше подумать о своей проблеме с точки зрения более высокого уровня и исправить свой дизайн таким образом, чтобы вы могли достичь своей цели без таких хаков.