Как прервать поток, выполняющий соединение с блокирующим сокетом?

У меня есть код, который порождает pthread, который пытается поддерживать соединение через сокет с удаленным хозяин. Если соединение когда-либо потеряно, он пытается восстановить соединение, используя блокирующий вызов connect()на своем сокете. Поскольку код выполняется в отдельном потоке, меня не особо волнует тот факт, что он использует API синхронного сокета.

То есть до тех пор, пока не наступит время выхода моего приложения. Я хотел бы выполнить некоторое подобие упорядоченного завершения работы, поэтому я использую примитивы синхронизации потоков, чтобы разбудить поток и сигнализировать о его выходе, а затем выполнить pthread_join()в потоке, чтобы дождаться его завершения. полный. Это прекрасно работает, если только поток не находится в середине вызова connect(), когда я командую завершить работу. В этом случае мне приходится ждать истечения времени ожидания подключения, что может занять много времени. Из-за этого кажется, что приложение долго закрывается.

Что я хотел бы сделать, так это каким-то образом прервать вызов connect(). После возврата вызова поток заметит мой сигнал выхода и корректно завершится.Поскольку connect()является системным вызовом, я подумал, что смогу намеренно прервать его с помощью сигнала (таким образом, вызов вернет EINTR), но я не уверен если это надежный метод в среде потоков POSIX.

Есть ли у кого-нибудь какие-либо рекомендации, как это сделать, либо с помощью сигналов, либо с помощью какого-либо другого метода? Следует отметить, что вызов connect()недоступен в коде некоторой библиотеки, которую я не могу изменить, поэтому переход на неблокирующий сокет невозможен.

5
задан Jason R 9 June 2012 в 16:00
поделиться