Простой регистратор C++ при помощи шаблона "одиночка"

Автоматический PY к EXE - .py к .exe преобразователю с помощью простого графического интерфейса, созданного с помощью Угря и PyInstaller в Python.

py2exe, вероятно, что Вы хотите, но это только работает над Windows.
PyInstaller работает над Windows и Linux.
Py2app работает над Mac

6
задан Chris Barlow 13 February 2012 в 18:02
поделиться

4 ответа

Используйте синглтон Мейерса. Если вы используете gcc, по крайней мере, инициализация является поточно-ориентированной.

class Singleton{
   Singleton(){
    //This is threadsafe in gcc, no mutex required
   }
   static Singleton * instance(){
      static Singleton myinstance;
      return &myinstance;
   }
};

gcc охраняет статическую конструкцию локальных переменных, если вы не отключите ее с помощью -fno-threadsafe-statics, я недавно писал об этом здесь

16
ответ дан 8 December 2019 в 13:00
поделиться

В приложениях с потоками я предпочитаю использовать синглтоны с функцией initialize () и asserts, чтобы убедиться, что initialize () используется перед первым экземпляром (). Вызовите initialize () из основного потока. Я не думаю, что ленивое создание экземпляров действительно является ключевой особенностью синглтона, особенно для регистратора.

Хотя ответ Аркаитца более элегантен, мои ответы позволяют избежать проблем с потоковой передачей на всех платформах за счет стоимости 1 дополнительной функции и некоторого создания экземпляров проблемы во время запуска для синглтонов с зависимостями (чему способствуют утверждения и, конечно,: разумно используйте синглтоны).

1
ответ дан 8 December 2019 в 13:00
поделиться

Один из подходов - убедиться, что ваш первый доступ к регистратору происходит до того, как ваше приложение запустит второй поток. Обращаясь к синглтону в тот момент, когда вы ЗНАЕТЕ об отсутствии конкуренции, вы гарантируете, что последующие обращения всегда будут находить уже существующий объект, и вы должны полностью избежать проблемы.

1
ответ дан 8 December 2019 в 13:00
поделиться

Вам действительно не нужна отдельная функция Initialize () так как это просто испортит ваш одноэлементный интерфейс. Просто получите экземпляр синглтона

VERIFY(NULL != Logger::Instance()); 

, прежде чем любой другой поток получит к нему доступ.

0
ответ дан 8 December 2019 в 13:00
поделиться
Другие вопросы по тегам:

Похожие вопросы: