У меня есть код, который порождает pthread
, который пытается поддерживать соединение сокетов с удаленным хостом. Если соединение когда-либо потеряно, он пытается повторно подключиться с помощью блокирующего вызова connect()
на свой сокет. Поскольку код работает в отдельном потоке, мне все равно, что он использует синхронный сокет API.Как прервать поток, выполняющий соединение блокирующего сокета?
То есть, пока наступит время для моего приложения для выхода. Я хотел бы выполнить некоторое подобие упорядоченного выключения, поэтому я использую примитивы синхронизации потоков, чтобы разбудить поток и подать сигнал для его выхода, а затем выполнить pthread_join()
в потоке, чтобы дождаться его завершения. Это отлично работает, если поток не находится в середине вызова connect()
, когда я командую выключение. В этом случае я должен ждать подключения к тайм-ауту, что может быть длительным. Это заставляет приложение работать долгое время, чтобы закрыть его.
Что бы я хотел сделать, так это прерывать вызов connect()
. После того, как вызов вернется, поток заметит мой выходной сигнал и отключится. Поскольку connect()
является системным вызовом, я думал, что могу умышленно прервать его с помощью сигнала (таким образом, обратный вызов EINTR
), но я не уверен, является ли это надежным методом в среде потоков POSIX.
Есть ли у кого-нибудь рекомендации относительно того, как это сделать, используя сигналы или с помощью какого-либо другого метода? В качестве примечания, вызов connect()
приведен в некотором коде библиотеки, который я не могу изменить, поэтому переход на неблокирующий сокет не является вариантом.
Также укажите языковой тег. – Tudor
Я на самом деле пишу на Python, но я не ищу ничего, что зависит от языка. Можно предположить, что я работаю в Linux. –
Закройте розетку. –