Почему присоединенный поток может отсутствовать при обнаружении взаимоблокировки в Ruby? - PullRequest
0 голосов
/ 02 июля 2019

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

Вот пример того, что я вижу:

  • Всего 9 тем. Первым является основной и текущий поток. Остальные 8 являются рабочими потоками.
  • Первый рабочий поток завершает свою работу и в конечном итоге получает ::IO:readlines.
  • Следующие 4 идут и начинают что-то, но затем wait на ConditionVariable, который первый рабочий поток в конечном итоге signal.
  • Остальным 3 нечего делать и останавливаться.
  • Теперь основной поток вызывает join во всех рабочих потоках после их запуска, сначала присоединяется к 1-му рабочему.
  • Это join не говорит:

    Живых тем не осталось. Тупик? (Со смертельным исходом)

  • Затем он распечатывает 5 потоков, 1 - основной поток, а остальные 4 - 4 ожидающих работника. 1-й рабочий поток отсутствует.
  • 1-й рабочий все еще жив, он продолжает свое дело после ошибки.

Каковы возможные причины, по которым присоединяемый поток не включен в обнаружение взаимоблокировки? Или это просто невозможно, и мое понимание того, что на самом деле идет неправильно,

1 Ответ

0 голосов
/ 09 июля 2019

Мое понимание было неверным. Несмотря на то, что из журнала отладки выяснилось, что он присоединяется к первому потоку, он не был Он присоединился к первому потоку, и это был второй, который вызвал тупик.

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

Это может быть вызвано буферизацией puts. Так что либо flush вывод, установите его на sync или разверните цикл так, чтобы объединения появлялись в разных строках, а обратный след подсказывал вам правильный.

Короче говоря, доверьтесь выходу из тупика. Если это противоречит вашим предположениям, подтвердите свои предположения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...