starvation in pthread_once?
Alexander Terekhov
TEREKHOV@de.ibm.com
Tue Mar 8 09:49:00 GMT 2005
[... pthread_once() and cancelation ...]
> Should one or more waiting threads get woken up and made to
> re-compete to run the init routine?
Yes. As for the rest, what you need here is DCSI-TLS or DCSI-MBR
(acquire/release memory barriers are needed on both Itanic and
XBOX NEXT... and, apart from hardware memory model, compiler
shall respect acquire/release semantics on IA-32 as well). For
serialization simply use a named mutex associated with address
of control variable and process id (to minimize contention).
DCSI-TLS: (__declspec(thread) for control variable; DLL issues
aside for a moment)
if (!once_control) {
named_mutex::guard guard(&once_control);
if (!once_control) {
<init>
once_control = true;
}
}
DCSI-MBR: (atomic<> for control variable)
if (!once_control.load(msync::acq)) {
named_mutex::guard guard(&once_control);
if (!once_control.load(msync::none)) {
<init>
once_control.store(true, msync::rel);
}
}
regards,
alexander.
More information about the Pthreads-win32
mailing list