Вы не можете освободить общий ресурс, когда его использует или может использовать другой поток. На практике вы обнаружите, что даже не можете написать код, который бы делал то, что вы предлагаете.
Подумай об этом. Когда вы идете на вызов close
, как вы можете узнать, что другой поток фактически заблокирован в recv
? Что если он собирается вызвать recv
, но другой поток вызывает socket
и получает дескриптор, который вы только что закрыли? Теперь этот поток не только не обнаружит никакой ошибки, но и будет вызывать recv
на сокете неправильный !
Вероятно, есть хороший способ решения вашей внешней проблемы, причина, по которой вам нужно выйти из блокирующего чтения сокета UDP. Есть также несколько уродливых хаков. Основной подход заключается в том, чтобы сделать сокет неблокирующим, и вместо того, чтобы блокировать чтение сокета UDP, имитируйте блокирующее чтение с select
или poll
. Затем вы можете прервать этот цикл несколькими способами:
Одним из способов является select
тайм-аут и проверка флага 'abort', когда select
возвращается.
Другой способ - также select
на конце чтения канала. Отправьте один байт в канал, чтобы прервать select
.