Class to get a thread safe count of previous Instances
Posted
by Mike Junkin
on March 12th, 1999
The following class uses that technique, along with a couple of the 'interlocked' functions to make it threadsafe. Instead of a simple flag, a count of running instances is kept. The count obtained by the class is only a snapshot.
To use the class simply create a static instance of it. Then check the 'Count()' method to determine how many instances of your application where running before the CPreviousInstance object was instantiated.
Code tested on WinNT 4.0 spk 4 VC6.0 spk 2
// CPreviousInstance.h
class CPreviousInstance
{
public:
CPreviousInstance();
virtual ~CPreviousInstance();
LONG Count() const
{
return m_previous;
}
private:
static LONG s_count;
LONG m_previous;
CPreviousInstance(const CPreviousInstance&);
CPreviousInstance& operator=(const CPreviousInstance&);
};
// CPreviousInstance.cpp
// static instance count stored in a shared read/write section
#pragma data_seg("Instance")
LONG CPreviousInstance::s_count = 0;
#pragma data_seg()
#pragma comment(linker,"/section:Instance,rws")
// Construction/Destruction
CPreviousInstance::CPreviousInstance():
m_previous(0)
{
m_previous = ::InterlockedIncrement(&s_count);
--m_previous;
}
CPreviousInstance::~CPreviousInstance()
{
::InterlockedDecrement(&s_count);
}

Comments
Even Jeffrey Richter did neglect the crash bug.
Posted by Legacy on 10/17/2000 12:00amOriginally posted by: Franz
I saw Mike Junkin's proposal in a slightly different coding published in Jeffrey Richter's Advanced Windows, an even an expert like him did not point out that this method fails when one of the instances crashes.
This proofs to me how much source code may exist which holds 'logical' bugs and un-thought possibilities.
ReplyWhat about a crash
Posted by Legacy on 03/15/1999 12:00amOriginally posted by: Mike
Some of the other methods allow the system to handle a crash. Wouldn't your count be incorrect if one of the instances would take a dive?
Reply