$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: williamkempf_at_[hidden]
Date: 2001-08-01 17:31:00
--- In boost_at_y..., "Alexander Terekhov" <terekhov_at_d...> wrote:
>
> > > consider the following example (just an illustration;
> > > no error checking, etc):
> > >
> > > int process_private_once_status = 0;
> > > int __declspec(thread) thread_local_once_status = 0;
> > >
> > > void dcl_once()
> > > {
> > >
> > > // 1st check
> > > if ( 0 == thread_local_once_status ) {
> > >
> > > // Create/Open named mutex
> > > HANDLE hndlMutex = CreateMutex( NULL,
> > > FALSE,
> > > ONCE_MUTEX_NAME(
> > > process_private_once_status ) );
> >
> > I never thought of using a named mutex approach. Not overly
> > efficient, but a very nice idea non-the-less. I've been thinking
too
> > much about portable threads to see this one. This makes me wonder
> > why you use TLS at all here. There seems to be no reason for it.
> >
> > typedef void (*once_routine)();
> > typedef bool once_t;
> > #define BOOST_ONCE_INIT false
> >
> > void run_once(once_t& once, once_routine func)
> > {
> > if (!once)
> > {
> > HANDLE mutex = CreateMutex(NULL, FALSE, "boost_once");
> > WaitForSingleObject(mutex, INFINITE);
> > if (!once)
> > {
> > func();
> > once = true;
> > }
> > CloseHandle(mutex);
> > }
> > }
>
> how about "ReleaseMutex(mutex)".
Accidently left out of the code. That's what you get when you code
in e-mails ;).
> also, named mutex
> need to be associated with &once (once control variable).
No, it doesn't "need" to be. With it not being associated with &once
it's just a "global" mutex. Every call to run_once() will use the
same conceptual mutex (I say conceptual since the named mutex may or
may not still actually exist in a call, so may or may not be
created). The Kernel will handle all synch issues of the creation
here.
Bill Kempf