Как пробудить Выберите звонок без периода ожидания из другого потока

Я ищу решение для пробуждения вызова select в c ++. Согласно требованию приложения я не могу установить тайм-аут из-за многопоточности, используя системный вызов select.

Пожалуйста, смотрите ниже сценарий.

я хочу, чтобы выбрать системный вызов ожидания в другом потоке. Я пытался записать данные в поток из основного потока, но он все равно не смог его разбудить.

Я хочу закрыть поток и сокет, если в этом потоке есть пустые данные.

Это вызывает вызов select, если сокетное соединение близко от другого процесса, но не работает с потоком.

Есть ли у кого-нибудь идеи по этому поводу?

-1

Решение

На недавнем Linux вы можете использовать eventfd, на всем в целом — канал, использование — зарегистрируйте одну сторону канала в селекторе для удобства чтения вместе с реальными сокетами, чтобы активировать селектор — просто запишите один байт на другой конец канала. В качестве альтернативы (если она есть в вашей libc) вы можете использовать pselect с сигмасом, чтобы поймать ALRM сигнализируйте и повышайте этот сигнал всякий раз, когда вам нужно разбудить селектор. Будьте очень осторожны с использованием подхода с использованием сигналов в многопоточном приложении (как «я бы не стал использовать»), так как если бы все сделано неправильно, сигнал может быть доставлен в случайный поток.

3

Другие решения

Спасибо всем за ценное предложение, я могу решить проблему с неисправность() вызовите сокет FD, используя ссылочный ответ, представленный на этом ссылка на сайт, он передаст сигнал пробуждения для выбора, который ожидает действия. Мы должны закрывать сокет только после вызова select, иначе select не сможет получить сигнал пробуждения.

-1

По вопросам рекламы [email protected]