Есть ли способ заставить поток выйти из бесконечного семафора ожидания, когда процесс будет убит? - PullRequest
1 голос
/ 18 ноября 2011

ОС: Windows. Язык: C

У меня есть поток, который отправляет запрос по TCP на сервер и бесконечно ждет ответа на семафор. Есть еще один поток, который читает сокет, копирует полученные данные в общий буфер и заставляет семафор выйти из режима ожидания. Все это прекрасно работает. Но в случае, если процесс по какой-то причине остановлен, поток, ожидающий семафора, будет ждать вечно, пока другие потоки не завершаются.

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

Ответы [ 2 ]

7 голосов
/ 18 ноября 2011

Семафоры не имеют владельцев .Если вы ждете семафор, то вы ждете, когда кто-нибудь подаст сигнал.Невозможно заявить: «Этот парень обязан сигнализировать семафор, и если он завершает работу, не сигнализируя об этом, я должен сделать что-то для восстановления».

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

2 голосов
/ 18 ноября 2011

Когда процесс завершается (как с TerminateProcess ), тогда все потоки в этом процессе также завершаются.Нет никаких исключений.Вот как работает система.Если какой-то поток еще жив, это автоматически означает, что его процесс также жив.Итак, то, что вы видите, отличается от того, что вы думаете, что видите.Чтобы убедиться, что процесс действительно «убит» (или прекращен в мире Windows), используйте вкладку «Диспетчер задач и процессы».

...