Ожидание нескольких событий C ++ - PullRequest
5 голосов
/ 27 мая 2009

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 27 мая 2009

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

4 голосов
/ 27 мая 2009

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

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

3 голосов
/ 26 апреля 2012

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

0 голосов
/ 27 мая 2009

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

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

...