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

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

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

Возьмите данные из стандартного ввода, например. получить линию ()

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

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


person Community    schedule 27.05.2009    source источник
comment
Да причина в этом, наверное, излишняя. У меня должен быть основной поток, ожидающий только условия. Внешний поток ввода, использующий select() для ожидания сокета и ввода файла. Затем оба дочерних потока и внешний входной поток могут стимулировать основной поток, используя условие.   -  person    schedule 27.05.2009


Ответы (4)


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

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

person Adam Rosenfield    schedule 27.05.2009
comment
Это просто необычно, потому что вы не можете сделать это (легко) в Unix. Это очень распространено в win32, где ожидание нескольких вещей (дескрипторов сокетов, очередей потоков, семафоров и многого другого) не составляет труда. - person nos; 19.07.2009

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

person Nikolai Fetissov    schedule 27.05.2009

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

person Michael Goldshteyn    schedule 26.04.2012

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

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

person veefu    schedule 27.05.2009