WaitForSingleObject and WaitForMultipleObjects equivalent in Linux?
c, linux, multithreading, porting, synchronization
Solution
Stick to `pthread_cond_timedwait` and use `clock_gettime`. For example:
struct timespec ts;
clock_gettime(CLOCK_REALTIME, &ts);
ts.tv_sec += 10; // ten seconds
while (!some_condition && ret == 0)
ret = pthread_cond_timedwait(&cond, &mutex, &ts);
Wrap it in a function if you wish.
UPDATE: complementing the answer based on our comments.
POSIX doesn't have a single API to wait for "all types" of events/objects as Windows does. Each one has its own functions. The simplest way to notify a thread for termination is using atomic variables/operations. For example:
Main thread:
// Declare it globally (argh!) or pass by argument when the thread is created
atomic_t must_terminate = ATOMIC_INIT(0);
// "Signal" termination by changing the initial value
atomic_inc(&must_terminate);
Secondary thread:
// While it holds the default value
while (atomic_read(&must_terminate) == 0) {
// Keep it running...
}
// Do proper cleanup, if needed
// Call pthread_exit() providing the exit status
Another alternative is to send a cancellation request using `pthread_cancel`. The thread being cancelled must have called `pthread_cleanup_push` to register any necessary cleanup handler. These handlers are invoked in the reverse order they were registered. Never call `pthread_exit` from a cleanup handler, because it's undefined behaviour. The exit status of a cancelled thread is `PTHREAD_CANCELED`. If you opt for this alternative, I recommend you to read mainly about cancellation points and types.
And last but not least, calling `pthread_join` will make the current thread block until the thread passed by argument terminates. As bonus, you'll get the thread's exit status.
Problem
I am migrating an applciation from windows to linux. I am facing problem with respect to `WaitForSingleObject` and `WaitForMultipleObjects` interfaces. In my application I spawn multiple threads where all threads wait for events from parent process or periodically run for every t seconds. I have checked `pthread_cond_timedwait`, but we have to specify absolute time for this. How can I implement this in Unix?