Assume that the following code is being executed by 10 threads.
pthread_mutex_lock(&lock)
Some trivial code
pthread_mutex_unlock(&lock)
For purpose of explanations lets say the threads are T1, T2, T3…..T10.
My requirement is that as long as T1 or T2 or T3( i.e any of T1, T2 or T3) is waiting for acquiring a lock, the other threads i.t T4, T5, T6…..T10 should not be able to acquire the lock i.e T1, T2 and T3 should have precedence in acquiring the lock with respect to other threads.
I guess it could be done by increasing the priority of threads T1, T2 and T3
i.e here is the pseudo code
if this thread is T1 or T2 or T3
increase its priority
pthread_mutex_lock(&lock)
Some trivial code
pthread_mutex_unlock(&lock)
if this thread is T1 or T2 or T3 decrease it priority to normal
Please note that I want a solution that is works for Linux platform and should use pthreads. I don’t really care about any other platform.
Also note that I don’t really want to make these 3 threads as realtime, I want them to exhibit their defualt behaviour(scheduling and priority) except that in the above mentioned small piece of code I want them to always have precedence in acquiring lock.
I have read some man pages about scheduling policies and scheduling priorities in Linux but can’t really make out 🙁
Will this work? Can you help me with the exact pthread API required to accomplish the above task?
Regards
lali
As I understand it, the only way you can truly guarantee this would be to write a lock that works like that yourself. However @xryl669’s answer that suggests using thread priority and priority inheritance is certainly worthy of consideration if it works for your use case.
To implement it yourself, you will need condition variables and counts of the number of waiting low / high priority threads.
In terms of the concepts and APIs you’ll need, it is relatively similar to implementing a read/write lock (but the semantics you need are completely different, obviously – but if you understood how the r/w lock is working, you’ll understand how to implement what you want).
You can see an implementation of a read write lock here:
http://ptgmedia.pearsoncmg.com/images/0201633922/sourcecode/rwlock.c
In the lower priority threads, you’d need to wait for high priority threads to finish, in the same way readers wait for writers to finish.
(The book the above code is taken from it also a great posix threads book btw, http://www.informit.com/store/product.aspx?isbn=0201633922 )