views:

853

answers:

4

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. pthread_cond_wait()

Take data from Standard input e.g. getline()

Listen on a socket e.g. accept()

What is the best way to accomplish this? Do I need a thread for each different input source? Thanks

A: 

For pthread_cond_wait, you would need threads, but it's not your program that waits on pthread_cond_wait. The others (file descriptor based) can be handled with a "select" call.

stefaanv
A: 

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.

veefu
+4  A: 

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.

Adam Rosenfield
It's just unusual because you can't do do this (easily) on unixes. It's a very common in win32, where waiting on multiple things(socket handles, thread queues, semaphores, whatnot) is a no-brainer.
nos
+5  A: 

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.

Nikolai N Fetissov