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