Re: singleton question
On Mar 2, 5:34 pm, Leigh Johnston <le...@i42.co.uk> wrote:
On 02/03/2011 17:33, Victor Bogado wrote:
On Mar 2, 2:28 pm, Victor Bogado<bog...@gmail.com> wrote:
On Mar 2, 12:31 pm, Leigh Johnston<le...@i42.co.uk> wrote:
On 02/03/2011 15:25, Victor Bogado wrote:
On Feb 24, 12:23 pm, kathy<yqin...@yahoo.com> wrote:
...
template<class T> T* CSingleton<T>::m_pInstance=NULL;
template<class T> T* CSingleton<T>::GetInstance()
{
if(!m_pInstance)
m_pInstance = new T;
Also This is not thread safe, you could have a race condition that
would end up with 2 instances. The best solution is to use the
instance as a static local in the instance method. The standard says
that it will be instantiated before the first call.
No; such a static will be instantiated *during* the first call however
you still have a race condition with a local static in a multi-threaded
situation.
This would have a race condition? I was under the impression that the
instantiation in that case would be atomic, but I never read the
standard myself, so I could be wrong :P.
the code should be :
static SingletonType& SingletonType::instance()
{
static SingletonType instance;
return instance;
}
:P
Not thread-safe. :p
That depends. According to the draft C++0x: "If control enters
the declaration [of a local static variable] concurrently while
the object variable is being initialized, the concurrent
execution shall wait for completion of the initialization." Pre
C++0x, anything involving threads was defined by the
implementation (undefined behavior according to the standard,
but an implementation is free to define undefined behavior, and
both Posix and Windows do). In this case, g++ has always
behaved as C++0x will require, or at least, it has officially
guaranteed it did, since the first version which supported
threading at all (3.0).
--
James Kanze