Minoru 09.08.2012 14:50 micropost

Век живи, век учись: почерпнул из http://juick.com/2013688 новый для себя трюк. Есть у нас некая нить, в которой крутится poll(), и нам нужно нить эту аккуратно завершать (то есть не просто pthread_cancel(), а по-человечески, с освобождением ресурсов). Раньше я бы тупо добавил таймаут в poll и проверял бы какую-то общую переменную-флаг, но теперь я умный: можно создать pipe и поместить его дескриптор в список опрашиваемых poll() ресурсов. Чтобы завершить нить, достаточно будет в этот самый пайп что-нибудь записать. Красота!

Recommended by:

@hirthwork: интересный финт ушами

and @magog
1. hirthwork 09.08.2012 14:54 mcabberA30B0295

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

2. mva 09.08.2012 14:58 N900

почему-то похоже на глязный хак

3. mvamva /2 09.08.2012 14:58 N900

4. Minoruhirthwork /1 09.08.2012 15:05 antaeus

poll() может быть заблокирован. Не слать же sigkill, право?

5. MinoruMinoru /4 09.08.2012 15:05 antaeus

Хотя стоп, сигналы же все равно обрабатываются, что бы там тред не делал.

6. Minorumva /2 09.08.2012 15:07 antaeus

Нормально, как по мне. Вот shared variable — это грязно! l29ah на bnw ( https://bnw.im/p/HLM0GH#6N2) рекомендует pthread_cleanup_push, кстати.

7. gelraenhirthwork /1 09.08.2012 15:07

например потому что тред получит просто EINTR в ответ на poll() и не будет знать надо ли ему повторять вызов или завершаться? или я ничего не пони в треда и ты о каких-то других сигналах?
Хотя, можно при EINTR проверять какой-нибуь флаг...

8. gelraenMinoru /5 09.08.2012 15:08

да, при получении сигнала во время ожидания завершения syscall он прерыватся и возвращает errno == EINTR

9. gelraenMinoru /6 09.08.2012 15:08

вот да, это как-то полущ костылей с общими переменными

10. hirthworkMinoru /5 09.08.2012 15:38 mcabber6A836458

блокирующий вызов выйдет, если треду придёт сигнал

11. hirthworkgelraen /7 09.08.2012 15:39 mcabber6A836458

при EINTR всегда нужно проверять подобные флаги

12. Minoruhirthwork /11 09.08.2012 15:40 antaeus

Какие? Shared variable, указывающую, следует ли завершаться? :)

13. hirthworkMinoru /12 09.08.2012 15:40 mcabber6A836458

например

14. Minoruhirthwork /13 09.08.2012 15:44 antaeus

То есть ты предлагаешь написать и установить в треде signal handler, а потом ещё пробросить туда же shared variable, которую нужно не забыть поменять перед тем, как бросать сигнал? И это предлагается в качестве альтернативы созданию и пробросу пайпа с последующей записью в него любой чепухи? А не джавист ли ты часом?..

15. hirthworkMinoru /14 09.08.2012 15:48 mcabber6A836458

я предлагаю вешать глобальный signal handler, суть которого будет в запуске shutdown thread, который вызовет синхронный метод MyServer.shutdown(), который уже у всех своих инстансов запустят процесс остановки и при необходимости пошлют сигналы тем тредам, которые при старте зарегистрировались как «прервите меня сигналом»

16. Minoruhirthwork /15 09.08.2012 15:52 antaeus

> создание тредов из signal handler'а
> синхронный метод
> инстансы
> треды регистрируются как «прервите меня сигналом»

Ты отдаёшь себе отчёт в том, что твое предложение — это такой лютый-бешеный overengineering, что просто слов нет?

17. hirthworkMinoru /16 09.08.2012 15:53 mcabber6A836458

ты отдаёшь себе отчёт, что твоё заявление ничем не подкреплено? и это не overengineering, у меня реально может крутиться больше тысячи тредов выполняющих десяток различных задач.

18. Minoruhirthwork /17 09.08.2012 16:02 antaeus

Моё заявление подкреплено тем фактом, что ты для решения маленькой проблемы предлагаешь добавить костыль (shared variable, проверяемая при получении сигнала), обвешанный enterprise-level рюшечками (синхронный метод, инстансы, регистрация тредов). По этой же причине я считаю твоё решение overengineering'ом.
> у меня
Извини, я не заметил, как мы перешли от решения проблемы с завершением одного-единственного треда к твоим огромным сервисам с тысячами тредов.

19. hirthworkMinoru /18 09.08.2012 16:03 mcabber6A836458

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

20. L29AhMinoru /18 09.08.2012 16:06 tkabber-mobix

Я предлагаю перейти к решению задачи в терминах barrel processor'а.

21. MinoruL29Ah /20 09.08.2012 16:11 antaeus

Хех, даже такие архитектуры придумывают…

Do you really want to delete ?