Image

Imagecaracrist wrote in Imageru_cpp

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>);
    ...
  }
}