On Sun, Apr 24, 2005 at 03:59:17PM -0700, Ken McMillan wrote:
I've been puzzling over something that I thought
someone on this list
might have a good solution for. I need to make a low
priority
(non-real time) thread wait for a real time thread to
do something. I
can't use a semaphore or condition variable for this,
because that
would mean the low priority thread must briefly take a
lock while
examining the condition variable or sempahore. If it
were to be
pre-empted while holding this lock, the RT thread
could block waiting
to obtain the lock in order to signal the condition or
modify the
semaphore.
This problem is called priority inversion.
I could prevent this by raising the priority of the
low priority
thread before taking the lock, but I don't know how to
do this in
a portable way (i.e., I want my app to port to windows
and mac, but
even on "posix compliant" systems, getting RT
privileges seems to
be pretty system-dependent).
This kind of solution to priority inversion is called priority inheritance.
AFAIK it is in POSIX, but Linux does not implement it (I think neither do
MacOS or Windows).
It actually seems to be implemented in Ingos realtime-preempt patch, but only
in kernel space. There also exists the robust mutex project from
Intel which features a patched kernel and NPTL.
http://developer.osdl.org/dev/mutexes/
http://developer.osdl.org/dev/robustmutexes/
One fine day these may make RT programming on Linux a lot easier, but
right now this is purely experimental, and also not portable to Systems
that are not fully POSIX compliant in this particular area. (Still assuming
that this stuff actually is in POSIX. I'd ask where to get the specs, but
then next thing you know I'll be writing my own operating system from scratch,
and I just don't have time for that :-D )
cheers,
Christian