Ожидание нескольких событий C ++

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

Слушайте состояние потока, например pthread_cond_wait ()

Взять данные из стандартного ввода, например GetLine ()

Слушайте на сокете, например принимаем ()

Каков наилучший способ сделать это? Нужен ли поток для каждого источника? Спасибо

 Ben Reeves27 мая 2009 г., 18:25
Да, причина этого, вероятно, не нужна. У меня должен быть основной поток, ожидающий только при условии. Поток "Внешний ввод", использующий select () для ожидания ввода сокета и файла. Тогда оба дочерних потока и поток «внешнего ввода» могут стимулировать основной поток, используя условие.

Ответы на вопрос(4)

Решение Вопроса

файловые дескрипторы без использования нескольких потоков, используяselect(2) системный вызов. Вы можете использоватьpthread_cond_timedwait ожидать переменную условия с тайм-аутом, таким образом, вы не будете ждать больше определенного времени.

Я думаю, что очень необычно хотеть одновременно ожидать либо условную переменную, либо файловый дескриптор - если вы абсолютно уверены, что это именно то, что вы хотите сделать, вам придется использовать несколько потоков с одним потоком звоню либоpthread_cond_wait/pthread_cond_timedwaitи другой поток, вызывающийselect или какая-то другая функция ввода / вывода.

 nos19 июл. 2009 г., 04:22
Это просто необычно, потому что вы не можете сделать это (легко) в Unix. Это очень распространено в win32, где ожидание нескольких вещей (дескрипторов сокетов, очередей потоков, семафоров и так далее) не представляет никакой сложности.

accept(2) а такжеstdin - использоватьpoll/select Вот. Вместо условной переменной создайте канал между потоками (у вас уже есть потоки, если мы говорим о резюме), ждите его в том жеpoll и напишите ему, когда событие произойдет.

pthread_cond_wait вообще. Просто используйтеeventfd вместо этого, что позволит вам прослушивать несколько событий, используя select / poll / epoll.

кажется, что эти три различных варианта обмена сообщениями являются взаимоисключающими для одного потока; Как один поток может читать из стандартного ввода, пока он ожидает состояние потока?

Если вы действительно не хотите порождать три потока, единственный вариант, который я могу понять, - это каким-то образом модифицировать или параметрировать библиотеки потоков, потоков и сокетов, чтобы получить ссылку на объект синхронизации.

Ваш ответ на вопрос