This is not Gentoo specific, and while I'm doing my prototyping and
development on a Gentoo system, the eventual target is not going to be
running Gentoo -- so feel free to ignore this thread or throw things
at me.

I'm trying to figure out how to synchronize threads which may be in
different processes.  Basically, I want thread A to be able to wake up
any number of other threads B, C, D, ... who are all blocking until A
says "go" (and who may or may not be in other processes).

Other (mostly embedded) OSes I've used had some sort of "event flag"
API that did exactly what I'm looking for, but I can't seem to find
such a thing in pthreads.

A condition variable in shared memory is the closest thing I have
found, and my test applications are working OK (so far).  But, I'm
unclear on the purpose of the mutex whose address you pass to
pthread_cond_wait().

Is it to prevent race conditions when manipulating the condition
variable's internal state? I don't see how that can be the case, since
the signal/broadcast call would have to be aware of it and it isn't.

The mutex appears to be there to serialize access to some user-defined
variable(s) (outside the condition variable itself) which I don't
have. So all the mutex locking/unlocking and resultant blocking of B,
C, D is just wasted overhead and pointless latency.

pthread_cond_wait(3) says

   When using condition variables there is always a Boolean predicate
   involving shared variables associated with each condition wait that
   is true if the thread should proceed. Spurious wakeups from the
   pthread_cond_timedwait() or pthread_cond_wait() functions may
   occur. Since the return from pthread_cond_timedwait() or
   pthread_cond_wait() does not imply anything about the value of this
   predicate, the predicate should be re-evaluated upon such return.

I have no "Boolean predicate" (which presumably comprises the
"user-defined variables outside the condition variable" I mentioned
above), and I don't want spurious wakeups, so a pthreads condition
variable would appear to be the wrong thing to use.

Is there something like an "event flag" similar to a condition
variable without spurious wakeup problem and without the extra
overhead of the mutex and "Boolean predicate".

Or am I expected to build my own "event flag" using the aforesaid 
"boolean predicate" just to avoid the spurious wakeup problem?  [I'm
guessing this is the case...]

-- 
Grant Edwards               grant.b.edwards        Yow! I'm DESPONDENT ... I
                                  at               hope there's something
                              gmail.com            DEEP-FRIED under this
                                                   miniature DOMED STADIUM ...


Reply via email to