Как пробудить Выберите звонок без периода ожидания из другого потока
Я ищу решение для пробуждения вызова select в C++. Согласно требованию приложения я не могу установить тайм-аут из-за многопоточности, используя системный вызов select.
Пожалуйста, смотрите ниже сценарий.
Я хочу, чтобы выбрать системный вызов ожидания в другом потоке. Я пытался записать данные в поток из основного потока, но он все равно не смог его разбудить.
Я хочу закрыть поток и сокет, если в этом потоке есть пустые данные.
Это вызывает вызов select, если сокетное соединение близко от другого процесса, но не работает с потоком.
Есть ли у кого-нибудь идеи по этому поводу?
2 ответа
Спасибо всем за ценное предложение, я могу решить проблему с помощью вызова shutdown() для сокета FD, используя эталонный ответ, присутствующий на этой ссылке, он передаст сигнал активизации для выбора, который ожидает действия. Мы должны закрывать сокет только после вызова select, иначе select не сможет получить сигнал пробуждения.
На недавнем Linux вы можете использовать eventfd
, на всем в целом - канал, использование - зарегистрируйте одну сторону канала в селекторе для удобства чтения вместе с реальными сокетами, чтобы активировать селектор - просто запишите один байт на другой конец канала. В качестве альтернативы (если она есть в вашей libc) вы можете использовать pselect
с сигмасом, чтобы поймать ALRM
Сигнал и поднять этот сигнал всякий раз, когда вам нужно разбудить селектор. Будьте очень осторожны с использованием подхода с использованием сигналов в многопоточном приложении (как "я бы не использовал"), так как если бы все сделано неправильно, сигнал может быть доставлен в случайный поток.