Прервать чтение () из другого потока - PullRequest
0 голосов
/ 27 марта 2012

Моя основная тема выглядит так:

while (!shouldExit) {
   int c = getchar();
   switch (c) {
     case .... :
     case .... :
     case 'x' : shuoldExit = true; break;
   }
}

Затем есть еще один поток, который читает данные из сети, и когда я получаю специальную команду, он устанавливает shouldExit = 1. Это работает отлично, единственная проблема в том, что getchar() в соответствии с strace продолжает блокировать на read(0).

Как мой рабочий поток может прервать системный вызов read в основном потоке?

Я пытался отправлять сигналы самому себе, но это просто убивает приложение (ожидается). Когда я перехватываю сигналы в нулевом обработчике, приложение продолжает работать, но read продолжает блокироваться.

Одним из вариантов может быть использование select(), но я не рад этому. Есть альтернативы?

EDIT: Смотрите также этот вопрос, который похож на мой, но мы ищем разные решения. Его решение не применимо к моей проблеме, так как блокировка read() находится в главном потоке.

прерывание чтения блокировки в linux

1 Ответ

2 голосов
/ 13 сентября 2013

Используйте pthread_kill () в потоке, о котором вы хотите сообщить.Не используйте kill ();в связи с этим, поскольку вы связались с ним, не используйте signal () - это один из наиболее запаздывающих непереносимых интерфейсов:

Поведение signal () варьируется в зависимости от версии UNIXи также исторически различался в разных версиях Linux.Избегайте его использования: используйте вместо этого sigaction (2).См. «Переносимость» ниже. "

[Ответ на этот вопрос дан в комментариях, но по какой-то причине все еще отображается в верхней части релевантных вопросов, оставшихся без ответа. Поэтому здесь, ради полноты]

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