Is there a recommended way to wait on multiple inputs. For example I would like my program to be able to receive input from 3 sources:
Listen on a thread condition e.g.
On modern Linux the best way to do this is not to use pthread_cond_wait
at all. Just use eventfd instead, which will enable you to listen for multiple events using select/poll/epoll.
It certainly seems as though these three different messaging options are mutually exclusive for a single thread; how can a single thread read from stdin while it's waiting for a thread condition?
If you really don't want to spawn three threads, the only option I can fathom is somehow modifying or parameterizing the thread, stream, and socket libraries to take a reference to a synchronization object.
No need for separate threads waiting for accept(2)
and stdin
- use poll/select
here. Instead of conditional variable, create a pipe between threads (you already have threads if we talk about CVs), wait on it in the same poll
and write to it when the event happens.
You can listen on multiple file descriptors without using multiple threads using the select(2) system call. You can use pthread_cond_timedwait to wait on a condition variable with a timeout, such that you don't wait more than a particular amount of time.
I think it's highly unusual to want to simultaneously wait on either a condition variable or a file descriptor of some sort -- if you're absolutely sure that that's what you want to do, you'll have to use multiple threads, with one thread calling either pthread_cond_wait
/pthread_cond_timedwait
, and the other thread calling select
or some other I/O function.