Static variable and thread safe...
С начала было так:
template<typename T>
T * Singletone()
{
static T instance;
return &instance;
}
Но потом стало понятно почему так нельзя, и стало так:
template<typename T>
T * Singletone()
{
static T * instance = NULL;
static volatile long cntr = 0;
static volatile bool set = false;
if (instance == NULL)
{
if (::InterlockedIncrement(&cntr) == 1)
{
instance = new T();
set = true;
}
else
while (!set) Sleep(0);
}
return instance;
}
Однако есть подозрение что и такой предосторожности не достаточно.
Есть ещё мысли в направлении такого:
static pthread_once_t once_block = PTHREAD_ONCE_INIT;
template<typename T>
static void Init()
{
Singletone<T>(true);
}
template<typename T>
T * Singletone(bool init = false)
{
if (init)
{
...
}
else
{
pthread_once(&once_block, Init<T>);
...
}
}
template<typename T>
T * Singletone()
{
static T instance;
return &instance;
}
Но потом стало понятно почему так нельзя, и стало так:
template<typename T>
T * Singletone()
{
static T * instance = NULL;
static volatile long cntr = 0;
static volatile bool set = false;
if (instance == NULL)
{
if (::InterlockedIncrement(&cntr) == 1)
{
instance = new T();
set = true;
}
else
while (!set) Sleep(0);
}
return instance;
}
Однако есть подозрение что и такой предосторожности не достаточно.
Есть ещё мысли в направлении такого:
static pthread_once_t once_block = PTHREAD_ONCE_INIT;
template<typename T>
static void Init()
{
Singletone<T>(true);
}
template<typename T>
T * Singletone(bool init = false)
{
if (init)
{
...
}
else
{
pthread_once(&once_block, Init<T>);
...
}
}
