Portable Conditional Wait for Inter-Process?

Daniel Eischen deischen at freebsd.org
Sun Mar 21 17:07:52 UTC 2010


On Sun, 21 Mar 2010, Pierre-Luc Drouin wrote:

> Hi,
>
> I am looking for a portable solution to put a process into a timed wait (a la 
> pthread_cond_timedwait) such that it can be waken up by another process using 
> something similar to pthread_cond_broadcast (there might be many waiters). I 
> guess shared pthread condition variables are not supported by FreeBSD, right? 
> Is there a portable way to do this? The only solution I can think of right 
> now is to use  alarm and sigwait on the waiters side and kill(wpid,SIGCONT) 
> on the other side with a list of pids.

Yeah, shared mutexes and CVs are not yet supported by FreeBSD.
You can use sigtimedwait() to conditionally sleep and kill
on the other side, but with caveats:

   o Only one thread per process can be woken with
     sigwait() and friends

   o You must ensure that no other threads (other than
     the waiter) have the "wake" signal unmasked.

You might consider using killpg() to send a signal to
multiple processes in a process group.

FreeBSD current (9.0) recently added support for shared semapores,
so you could give those a try.  You might be able to use
sem_timedwait() instead of pthread_cond_timedwait() depending on
your needs, but you are limited to waking only one thread
at a time via sem_post().

You could also have a pipe or domain socket between the sender
and each waiting processes.  I suppose you could use aio_write()
on the sender side to write to selected file descriptors with
one operation.  The waiters would be using poll() or select()
with a timeout.

-- 
DE


More information about the freebsd-threads mailing list