Как завершить поток, который висит на блокировке ввода-вывода независимым от платформы способом? - PullRequest
2 голосов
/ 06 февраля 2012

Поскольку неблокирующий консольный ввод-вывод не поддерживается в стандарте C ++, я пытаюсь выполнить консольный ввод в отдельном потоке.У меня все еще есть проблема завершения нити снаружи однако.Как я могу сделать это без сигналов Unix?

Если я использую select (), он может сигнализировать, если что-то находится во входном буфере, но если это не целая строка (содержащая новую строку), то «cin << myvar» все равно будет блокироваться, и я не могупроверьте мой стоп-флаг между ними. </p>

Меня интересует любое совместимое с C ++ 11 решение.

Ответы [ 3 ]

4 голосов
/ 06 февраля 2012

Ты не можешь вообще. Под Posix вы можете настроить поток, чтобы поймать конкретный сигнал и использовать pthread_kill(); после возвращения из обработчик сигнала, блокирующий ввод-вывод на системном уровне (т.е. read()), вернуть с errno равным EINTR. Помимо этого, вы в значительной степени милость реализации iostream, которая имеет два варианта ( разработчик iostream, а не вы):

  • он может вернуться назад и повторить чтение, или

  • он может рассматривать это как условие ошибки и установить failbit.

В первом случае, вы ничего не можете с этим поделать, кроме реализовать свой собственный streambuf и использовать его (который для консоли ввод, не так сложно, как кажется). Во-вторых, вы должны установить errno до 0 перед чтением и проверьте его после сбоя чтения (на уровень iostream); если это EINTR, вы можете принять соответствующие меры, не забудьте сбросить ошибку (std::ios_base::clear()), если вы намерены повторно использовать поток.

1 голос
/ 06 февраля 2012

Вы можете использовать cin.get(), чтобы прочитать один символ, и select в комбинации, чтобы избежать блокировки потока. Также cin.rdbuf()->in_avail() возвращает количество готовых символов в буфере.

0 голосов
/ 06 февраля 2012

По моему скромному опыту, никогда не видел стабильного способа отменить синхронную и / или блокирующую операцию ввода-вывода. То есть это нельзя сделать с помощью оператора "cin >>".

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