2011-02-09 9 views
1

Кто-нибудь знает, как определить, заблокирован ли поток в настоящее время? В принципе, я хочу проверить, заблокирован ли какой-то поток (в этом случае на прием приветствия сокета датграммы AF_UNIX) и отправить ему сигнал на прерывание, если он есть.Определить, заблокирован ли поток

Я работаю над Linux, используя Boost.Thread смысл под которыми я использую pthreads. Моя система имеет NPTL.

Я думаю, что ответ «нет», но хочу посмотреть, не хватает ли я чего-то.

+0

Если вы уже используете Boost :: Thread, почему бы не использовать Boost :: asio для чтения? – Max

+0

Насколько я знаю, Boost.Asio не решит мою проблему. Мне нужно определить, блокирует ли поток поток и прерывает его, если он есть. Boost.Asio был бы полезен вообще, но не решает эту проблему, не так ли? – deuberger

ответ

2

Это нелегко (возможно, используя функциональность, предназначенную для отладчиков, но она не является простой, переносной или безопасной).

Вы все равно не хотите этого делать, потому что такое использование будет иметь неотъемлемое состояние гонки. Вы можете проверить, блокируется ли поток непосредственно перед тем, как он собирается блокировать (в этом случае вы пропустите пробуждение), или он может прекратить блокировку сразу после того, как вы обнаружите, что он блокирует.

Обычный метод, чтобы решить вашу проблему, является «само-пайп трюк»:

  • Создайте трубу с pipe();
  • Целевая нить вместо блокировки в recvfrom(), блоки в poll() или select(). Дескрипторы файлов для мониторинга включают в себя сокет датаграммы и считываемый конец канала.
  • Чтобы разбудить целевой поток, другой поток записывает один байт на конец записи трубы.

(recvfrom() также должен быть изменен, чтобы использовать MSG_DONTWAIT флаг, так как мы никогда не хотим, чтобы блокировать здесь, и всегда блокировать в poll()/select() вместо).

0

Ответ отрицательный. Возможно, это будет способ сделать это на вашей платформе, но в целом я не знаю, как это сделать.

Теперь, прежде чем нырнуть в уровне документации платформы нижнего думать дважды, если это действительно то, что вы хотите:

Поток всегда блокируется по причине. Например, он может быть заблокирован в FILE IO. Это может быть прервано безопасно, если вы правильно обрабатываете возвращаемые значения. С другой стороны, поток также может быть заблокирован в новом вызове/удалении или другой стандартной библиотечной функции. Прерывание потока внутри библиотеки времени выполнения является квитанцией о катастрофе.

Я знаю, что у вас есть причина спросить здесь, но imho лучше подумать о вашей проблеме с точки зрения более высокого уровня и исправить свой дизайн таким образом, чтобы вы могли достичь своей цели без таких хаков.

+0

Хорошие моменты ... спасибо ... вы говорите, что нет способа сделать это в Boost.Threads или что это невозможно сделать в pthreads/NPTL? Я думаю, что это так, поэтому мне пришлось бы вернуться к чему-то еще более низкому уровню, чего я не думаю, что хочу делать. – deuberger