Tiemout для функции, которая ждет бесконечно (например, listen ()) - PullRequest
2 голосов
/ 08 апреля 2010

Я не совсем уверен, возможно ли сделать то, что я собираюсь спросить, поэтому я подумал, что я буду спрашивать.

У меня есть многопоточная программа, где потоки совместно используют блок памяти для связинеобходимая информация.Одной из данных является завершение потоков, где потоки постоянно проверяют это значение, и когда значение изменяется, они знают, что пришло время для pthread_exit().Один из потоков содержит функцию listen() и, кажется, ждет бесконечно.Это может быть проблематично, если нет никого, кто хочет установить соединение, и поток должен выйти, но он не может проверить значение, должен ли поток завершаться или нет, так как он застрял на listen() и не может выйти за пределы.

while(1)
{
  listen();
  ...
  if(value == 1)
    pthread_exit(NULL);
}

Моя логика выглядит примерно так, если она помогает лучше проиллюстрировать мою точку зрения.Я подумал, что это решит проблему - позволить listen () ждать некоторое время, и если ничего не происходит, он переходит к следующему утверждению.К сожалению, ни один из двух аргументов listen() не имеет ограничения по времени.Я даже не уверен, правильно ли я поступаю с многопоточным программированием, у меня совсем немного опыта.Так это хороший подход?Возможно, есть лучший способ сделать это?Спасибо за любые проницательные комментарии.

РЕДАКТИРОВАТЬ: просто чтобы уточнить, причина listen() в цикле while в том, что это сервер и будет подключен к нескольким клиентам одновременно.

Ответы [ 3 ]

1 голос
/ 08 апреля 2010

Вы должны отправить сигнал из другого потока (тот, который меняет значение на 1).Функция прослушивания вернется с кодом ошибки EINTR.

0 голосов
/ 08 апреля 2010

Вы бы установили сокет в неблокирующее состояние и ожидали события, используя select / poll или аналогичный - select / poll позволяет установить время ожидания.

Обратите внимание, что listen () не блокирует, а просто отмечает, что сокет готов к обработке входящих соединений - accept () будет следующим шагом, который блокирует.

0 голосов
/ 08 апреля 2010

IIRC вам нужно установить время ожидания с помощью setsockopt() и проверить errno после того, как listen() не сможет увидеть, истекло ли это время или серьезная ошибка.

Мне кажется, что listen() можно сделать только один раз, если вы всегда используете один и тот же сокет подключения. Но, возможно, у вас будет такая же проблема с accept().

...