Boost logo

Boost :

From: Peter Dimov (pdimov_at_[hidden])
Date: 2007-03-22 07:52:21


Anthony Williams wrote:
> "Peter Dimov" <pdimov_at_[hidden]> writes:
>
>> There is a note in N2178 that shows how to implement call_once on
>> top of pthread_once2_np. ;-)
>
> I know that it's possible, just "much harder": ...

You haven't even looked at it, have you. :-/

[Note: a typical implementation of call_once is shown below:

template< class F > void __call_once_helper( void * pv )
{
    F * pf = static_cast< F * >( pv );
    (*pf)();
}

template< class F > void call_once( pthread_once_t & once_control, F f )
{
    pthread_once2_np( &once_control, &__call_once_helper<F>, &f );
}

--end note.]

> Since on Windows the code for call_once is pretty much the same whether or
> not
> init_routine takes arguments, it seems pointless to go round the houses
> setting thread-specific data just for the benefit of writing call_once in
> terms of pthread_once rather than vice versa.

That is why there is pthread_once2_np in N2178. The actual call_once code is
pretty much the same on POSIX as well, and it is equally pointless to use
TLS there. So I tried to fix both.


Boost list run by bdawes at acm.org, gregod at cs.rpi.edu, cpdaniel at pacbell.net, john at johnmaddock.co.uk