futex priority based wakeup

Benedict, Michael MBenedict at twacs.com
Thu Sep 13 00:56:51 EST 2007


Nguyen Nguyen wrote:
> I have seen something similar before.  Our fix was to use
> pthread_attr_setinheritsched(&attr, PTHREAD_EXPLICIT_SCHED)
> so child threads wouldn't inherit attribute from parent.

> On 9/11/07, Ilya Lipovsky <lipovsky at cs.bu.edu> wrote:
> 
> 	Hmm. Just for kicks - inside the important thread could you add:
<snip>
> 	printf("important's policy is %d and priority is %d\n",
curpolicy,
<snip>
> 	Do similar for the unimportant thread, and see if you
> get anything weird -
> 	e.g. priorities come out to be the same for threads.


Thank you both!  You were each correct, and your input has been greatly
appreciated.

Adding the printf() resulted in:
unimportant's policy is 0 and priority is 0
unimportant waiting for futex
important's policy is 0 and priority is 0
important waiting for futex
main's policy is 0 and priority is 0
futex FUTEX_WAKE
unimportant's policy is 0 and priority is 0
unimportant got futex!
important's policy is 0 and priority is 0
important got futex!

Adding the PTHREAD_EXPLICIT_SCHED resulted in:
unimportant's policy is 1 and priority is 1
unimportant waiting for futex
important's policy is 1 and priority is 99
important waiting for futex
main's policy is 0 and priority is 0
futex FUTEX_WAKE
important's policy is 1 and priority is 99
important got futex!
unimportant's policy is 1 and priority is 1
unimportant got futex!

Verifying with pthread_muxtex / glibc 2.3.6:
unimportant's policy is 1 and priority is 1
unimportant waiting for mutex
important's policy is 1 and priority is 99
important waiting for mutex
main's policy is 0 and priority is 0
main unlocking mutex
important's policy is 1 and priority is 99
important got mutex!
unimportant's policy is 1 and priority is 1
unimportant got mutex!

And, to come full circle, regression on 2.6.21 resulted in:
unimportant's policy is 1 and priority is 1
unimportant waiting for futex
important's policy is 1 and priority is 99
important waiting for futex
main's policy is 0 and priority is 0
futex FUTEX_WAKE
unimportant's policy is 1 and priority is 1
unimportant got futex!
important's policy is 1 and priority is 99
important got futex!

Now it is time to audit my other code and make sure to add
PTHREAD_EXPLICIT_SCHED where appropriate.  Thank you.
	-Michael



More information about the Linuxppc-embedded mailing list