$include_dir="/home/hyper-archives/boost/include"; include("$include_dir/msg-header.inc") ?>
From: Moshe Matitya (Moshe.Matitya_at_[hidden])
Date: 2007-02-08 04:42:26
On Tuesday, February 06, 2007 8:09 PM, Andrey Semashev wrote:
>
> Tuesday, February 6, 2007, 1:34:50 AM, you wrote:
>
> > ...
> >
> > What kind of solutions have you come up with for lazily initializing
> > singletons in a thread-safe manner?
>
> In most cases I tried not to create the singleton lazily but
> initialize it as soon as possible. The perfect time is on executable
> module load which, AFAIK, is always done in single thread on
> platforms I have faced yet. Such approach was quite sufficient for me
> since it solves the key problem of the singleton creation.
I don't see how such an assumption can be made. What if a thread is
started in the constructor or initializer of a global object? I.e.:
void thread_func()
{
// This may be called before, or concurrently with,
// your singleton early-initialization function
singleton::instance()->do_something();
}
class foo
{
foo()
{
boost::thread my_thread (&thread_func);
}
};
// Constructed on module load
foo global_foo;
Then there's the issue of singletons located in shared libraries (on
*nix platforms) or DLL's (on Windows). If these modules are loaded
dynamically, there may already be multiple threads running.
Moshe