PaulH <paul.h...@gmail.com> wrote:
On Jun 25, 1:29 pm, "Igor Tandetnik" <itandet...@mvps.org> wrote:
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.
//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.
I am.
But that defeats the whole point of having the mutex in the first place.
It only helps any when two threads are trying to acquire _the same_
mutex, in which case one thread is allowed to proceed while the other
waits for the mutex to be released. But now that each thread can create
and happily acquire its own mutex, the program (mis)behaves the exact
same way as if no mutexes were there at all.
Basically, you have a room that you want only one person to be in at the
same time. There is a door that won't let a new person in until the
previous person has come out. But then you give each person the ability
to cut her very own door into the room, so no two people ever try to use
the same door.
--
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
Instance().