I have a class loaded from a DLL that I would like to implement as a
multi-threadable singleton. Unfortunately, I seem to still be getting
two distinct instances of this class. It is implemented as below.

The only funny thing I am doing is to load the DLL from two threads
simultaneously (thus the need for the singleton). But, according to
other posts I've read, the OS will point them both to the same
instance of the DLL so that only one thread actually loads the DLL.

Can anybody point out where I may be going wrong?

Thanks,
PaulH

//singletonclass.h
class SingletonClass : BaseClass
{
public:
static SingletonClass& Instance();
~SingletonClass();
//... Implement BaseClass functions
private:
static std::auto_ptr< SingletonClass > _theInstance;
static Mutex* _m;
}

//singletonclass.cpp
std::auto_ptr< SingletonClass > SingletonClass::_theInstance;
Mutex* SingletonClass::_m;

/*static*/ SingletonClass& SingletonClass::Instance()
{
Mutex::Create( &_m );
_m->lock();
if( _theInstance.get() == NULL )
_theInstance.reset( new SingletonClass() );
_m->unlock();
return *_theInstance;
}

//dll.cpp
MY_API BaseClass* Create()
{
return &SingletonClass::Instance();
}

Re: singleton in a DLL loaded class by amparikh

amparikh
Mon Jun 25 13:07:12 CDT 2007

On Jun 25, 10:57 am, PaulH <paul.h...@gmail.com> wrote:
> I have a class loaded from a DLL that I would like to implement as a
> multi-threadable singleton. Unfortunately, I seem to still be getting
> two distinct instances of this class. It is implemented as below.
>
> The only funny thing I am doing is to load the DLL from two threads
> simultaneously (thus the need for the singleton). But, according to
> other posts I've read, the OS will point them both to the same
> instance of the DLL so that only one thread actually loads the DLL.

If the two threads are from the same process, then there will be only
one instance of the DLL.
Having said that, even if the threads are from different process with
each process having different instanced of the DLL, you need to
synchronize to have one unique instance of the class.

>
> Can anybody point out where I may be going wrong?
>
> Thanks,
> PaulH
>
> //singletonclass.h
> class SingletonClass : BaseClass
> {
> public:
> static SingletonClass& Instance();
> ~SingletonClass();
> //... Implement BaseClass functions
> private:
> static std::auto_ptr< SingletonClass > _theInstance;
> static Mutex* _m;
>
> }
>
> //singletonclass.cpp
> std::auto_ptr< SingletonClass > SingletonClass::_theInstance;
> Mutex* SingletonClass::_m;
>
> /*static*/ SingletonClass& SingletonClass::Instance()
> {
> Mutex::Create( &_m );
> _m->lock();
> if( _theInstance.get() == NULL )
> _theInstance.reset( new SingletonClass() );
> _m->unlock();
> return *_theInstance;
>
> }
>
> //dll.cpp
> MY_API BaseClass* Create()
> {
> return &SingletonClass::Instance();
>
>
>
> }- Hide quoted text -
>
> - Show quoted text -

Looks ok though one thing I cannot know is you implementation of
Mutex class ? How are you implementing it internally ? Are you
implementing it as a Critical Section or as Regular Mutex ? Because
Critical Section guarentees synchonization only within a process and
not across processes and so if your threads are from different
processes, then there could be a problem.


Re: singleton in a DLL loaded class by Igor

Igor
Mon Jun 25 13:29:18 CDT 2007

PaulH <paul.heil@gmail.com> wrote:
> I have a class loaded from a DLL that I would like to implement as a
> multi-threadable singleton. Unfortunately, I seem to still be getting
> two distinct instances of this class. It is implemented as below.
>
> //singletonclass.h
> class SingletonClass : BaseClass
> {
> public:
> static SingletonClass& Instance();
> ~SingletonClass();
> //... Implement BaseClass functions
> private:
> static std::auto_ptr< SingletonClass > _theInstance;
> static Mutex* _m;
> }
>
> //singletonclass.cpp
> std::auto_ptr< SingletonClass > SingletonClass::_theInstance;
> Mutex* SingletonClass::_m;
>
> /*static*/ SingletonClass& SingletonClass::Instance()
> {
> Mutex::Create( &_m );

What does Mutex::Create do? It appears you are creating a new mutex
every time Instance() is called.
--
With best wishes,
Igor Tandetnik

With sufficient thrust, pigs fly just fine. However, this is not
necessarily a good idea. It is hard to be sure where they are going to
land, and it could be dangerous sitting under them as they fly
overhead. -- RFC 1925



Re: singleton in a DLL loaded class by PaulH

PaulH
Mon Jun 25 13:34:53 CDT 2007

On Jun 25, 1:07 pm, ampar...@gmail.com wrote:
> On Jun 25, 10:57 am, PaulH <paul.h...@gmail.com> wrote:
>
> > I have a class loaded from a DLL that I would like to implement as a
> > multi-threadable singleton. Unfortunately, I seem to still be getting
> > two distinct instances of this class. It is implemented as below.
>
> > The only funny thing I am doing is to load the DLL from two threads
> > simultaneously (thus the need for the singleton). But, according to
> > other posts I've read, the OS will point them both to the same
> > instance of the DLL so that only one thread actually loads the DLL.
>
> If the two threads are from the same process, then there will be only
> one instance of the DLL.
> Having said that, even if the threads are from different process with
> each process having different instanced of the DLL, you need to
> synchronize to have one unique instance of the class.
>
>
>
>
>
> > Can anybody point out where I may be going wrong?
>
> > Thanks,
> > PaulH
>
> > //singletonclass.h
> > class SingletonClass : BaseClass
> > {
> > public:
> > static SingletonClass& Instance();
> > ~SingletonClass();
> > //... Implement BaseClass functions
> > private:
> > static std::auto_ptr< SingletonClass > _theInstance;
> > static Mutex* _m;
>
> > }
>
> > //singletonclass.cpp
> > std::auto_ptr< SingletonClass > SingletonClass::_theInstance;
> > Mutex* SingletonClass::_m;
>
> > /*static*/ SingletonClass& SingletonClass::Instance()
> > {
> > Mutex::Create( &_m );
> > _m->lock();
> > if( _theInstance.get() == NULL )
> > _theInstance.reset( new SingletonClass() );
> > _m->unlock();
> > return *_theInstance;
>
> > }
>
> > //dll.cpp
> > MY_API BaseClass* Create()
> > {
> > return &SingletonClass::Instance();
>
> > }- Hide quoted text -
>
> > - Show quoted text -
>
> Looks ok though one thing I cannot know is you implementation of
> Mutex class ? How are you implementing it internally ? Are you
> implementing it as a Critical Section or as Regular Mutex ? Because
> Critical Section guarentees synchonization only within a process and
> not across processes and so if your threads are from different
> processes, then there could be a problem.

This only needs to work between threads of a single process. I didn't
realize the difference between the CS and the Mutex. I have it
implemented as below as a CS, so the "Mutex" name is a misnomer.

-Paul

class Mutex
{
public:
static HRESULT Create( Mutex** ppMutex )
{
Mutex *pMutex = new Mutex();
if( !pMutex )
{
return E_OUTOFMEMORY;
}

if( !InitializeCriticalSectionAndSpinCount( &pMutex->_cs,
0 ) )
{
HRESULT hr = HRESULT_FROM_WIN32( GetLastError() );
delete pMutex;
return hr;
}
pMutex->_Initialized = TRUE;
*ppMutex = pMutex;
pMutex = NULL;
return S_OK;
};
~Mutex()
{
if( this->_Initialized )
DeleteCriticalSection( &this->_cs );
};
void lock()
{
EnterCriticalSection( &this->_cs );
};
void unlock()
{
LeaveCriticalSection( &this->_cs );
};

private:
Mutex(){};

CRITICAL_SECTION _cs;
BOOL _Initialized;
};


Re: singleton in a DLL loaded class by PaulH

PaulH
Mon Jun 25 13:36:53 CDT 2007

On Jun 25, 1:29 pm, "Igor Tandetnik" &