Определить, заблокирован ли поток - PullRequest
1 голос
/ 09 февраля 2011

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

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

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

Ответы [ 2 ]

2 голосов
/ 10 февраля 2011

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

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

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

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

0 голосов
/ 09 февраля 2011

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

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

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

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

...