убить отдельную нить с сокетом - PullRequest
0 голосов
/ 13 апреля 2010

У меня есть отдельный поток ListenerThread с сокетом, который прослушивает информацию, передаваемую каким-либо удаленным сервером. Это создается в конструкторе одного класса, который мне нужно разработать.

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

Мои вопросы:

  1. что происходит с сетевыми ресурсами, выделенными функцией, передаваемой thead? Правильно ли закрыта розетка или что-то ожидает? (это больше всего беспокоит)

  2. Достаточно ли быстро эта процедура, т. Е. Уничтожен ли поток, чтобы немедленно прервать его?

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

Большое спасибо за вашу помощь

С уважением MNSTN

ПРИМЕЧАНИЕ: я использую boost :: thread в C ++

Ответы [ 2 ]

2 голосов
/ 13 апреля 2010

Когда вы убиваете поток, вы не можете быть уверены, какие ресурсы он содержит. Например, это может быть мьютекс кучи; если вы уничтожите поток, мьютекс останется заблокированным, и никто (в вашем процессе) не сможет выделить динамическую память, когда-либо.

Гораздо лучше делать это мирным путем, чем силой. Просто добавьте способ сообщить вашей теме, что она больше не нужна. Это может быть boost::condition. Поток проверит это условие и остановится, когда ему сообщат.

2 голосов
/ 13 апреля 2010
  1. Сетевые ресурсы принадлежат процессу, а не потоку, поэтому сокет все еще открыт.

  2. boost::thread не имеет kill метод. Ты можешь только прервите это. Эффект не немедленный и зависит от ОС планировщик.

  3. Для просмотра ресурсов сети процесс держит проверку lsof и <а href = "http://linux.die.net/man/8/netstat" rel =" nofollow noreferrer "> netstat(8) с опцией -p.

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

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