This is the mail archive of the
mailing list for the pthreas-win32 project.
starvation in pthread_once?
- From: Gottlob Frege <gottlobfrege at gmail dot com>
- To: pthreads-win32 at sources dot redhat dot com
- Date: Thu, 3 Mar 2005 04:32:42 -0500
- Subject: starvation in pthread_once?
- Reply-to: Gottlob Frege <gottlobfrege at gmail dot com>
I'm concerned about the Sleep(0) in pthread_once:
if (InterlockedIncrement (&(once_control->started)) == 0)
* First thread to increment the started variable
once_control->done = PTW32_TRUE;
* Block until other thread finishes executing the onceRoutine
* The following gives up CPU cycles without pausing
IIRC, Sleep(0) does not relinquish time slices to lower priority
threads. (Sleep(n) for n != 0 does, but 0 does not). So, if a lower
priority thread is first in, followed closely by a higher priority
one, the higher priority thread will spin on Sleep(0) *forever*
because the lower, first thread will never get a chance to set done.
So even Sleep(10) should be good enough. In theory, there could be
enough higher priority threads in the system that the first thread
still doesn't get in (ever?!), but unlikely. And that would probably
mean a general design flaw of the calling code, not pthread_once.