Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76

Потокобезобасный синглтон

21.12.2013, 21:05. Показов 1194. Ответов 6
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Имеется следующий драфт синглтона с отложенной инициализацией:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
class NormPool;
typedef std::shared_ptr<NormPool> PNormPool;
 
class NormPool
{
public:
    ~NormPool() { std::cout<<"destroy NormPool singleton\n"; }
    
    static void addRecord(int key, const std::string& value)
    {
        //Как сделать  эту инициалзицию потокобезопасной? 
        if(itself == nullptr) 
        {
            PNormPool temp(new NormPool);
            std::swap(temp, itself);
        }
        
        //это замочек для вставки пары в мапу. Правильно ли сделано?
        {
            boost::mutex::scoped_lock lock(itself->insert_mutex);
            itself->_mp[key] = value;
        }
    }
    
private:
    NormPool() { std::cout<<"create NormPool singleton\n"; }
    NormPool(const NormPool& other) { }
    NormPool& operator = (const NormPool& other) { }
    
    static PNormPool itself;
    boost::mutex insert_mutex;
    std::map<int, std::string> _mp;
};
 
PNormPool NormPool::itself = nullptr;
Первый раз пытаюсь написать потокобезопасный код, поэтому у меня большая просьба к опытным людям - помогите сделать потокобезопасным блок инициализации
C++
1
2
3
4
5
 if(itself == nullptr) 
 {
      PNormPool temp(new NormPool);
      std::swap(temp, itself);
 }
а также корректно ли сделан замок для операции вставки?
Заранее спасибо.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.12.2013, 21:05
Ответы с готовыми решениями:

Синглтон
необходимо разработать класс, который бы гарантировал, что его экземпляр будет один и только один из объектов данного класса

Синглтон
Можете пожалуйста обьяснить суть вот этого кода: #define imSingleton ACE_Singleton&lt;Singleton_obj, ACE_Null_Mutex&gt;::instance()

Синглтон как антипаттерн
Доброе утро, данный паттерн называют часто анти-паттерном, но не называют &quot;валидную&quot; ему замену - как она? Как по мне...

6
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.12.2013, 21:19
в новом стандарте инициализация статических объектов - потокобезопасная.
поэтому сгодится синглтон мейерса.

C++
1
2
3
4
5
static NormPool& GetInstance()
{
  static std::unique_ptr<NormPool> pool(new NormPool());
  return *pool;
}
и везде в другиx местах использовать этот GetInstance();

операцию вставки лучше сделать еще и нестатическим методом и в ней уже лочить.
есть постоянные GetInstance напрягают, то можно добавить статическую утилитную AddRecord:
C++
1
2
3
4
static void AddRecord(int key, const std::string& value)
{
  GetInstance().AddRecord(key, value);
}
лок вроде корректный. кстати в std есть мьютексы и локи. если буст заюзан не по каким-то
хитрым причинам, то лучше все-таки из std юзать.
1
15 / 15 / 3
Регистрация: 04.07.2013
Сообщений: 76
21.12.2013, 21:28  [ТС]
Цитата Сообщение от DU Посмотреть сообщение
static NormPool& GetInstance()
{
static std::unique_ptr<NormPool> pool(new NormPool());
return *pool;
}
А здесь обязательно поинтер, или можно просто:
C++
1
2
3
4
5
static NormPool& GetInstance()
{
  static NormPool pool;
  return pool;
}
Это безопасно будет?
0
DU
1500 / 1146 / 165
Регистрация: 05.12.2011
Сообщений: 2,279
21.12.2013, 21:38
поинтер не обазятельно. можно и просто объект.
на счет безопастности - с точки зрения компилятора разницы нет. в обоих случаях это
инициализация какого-то статического объекта. просто типы у них отличаются.
но я могу и ошибаться. стандарт на эту тему я не ковырял, просто в книге одной вычитал.

до кучи прорекламирую книжку:
Параллельное программирование на С++ в действии. Практика разработки многопоточных программ
C++ Concurrency in Action: Practical Multithreading

Автор: Энтони Уильямс
Переводчик: А. Слинкин
Языки: Русский
Издательство: ДМК Пресс
ISBN 978-5-94074-448-1; 2012 г.
http://www.ozon.ru/context/detail/id/17636939/
1
Pied Piper
 Аватар для ArmanPrestige
237 / 228 / 57
Регистрация: 15.01.2013
Сообщений: 855
12.06.2015, 23:07
Цитата Сообщение от DU Посмотреть сообщение
в новом стандарте инициализация статических объектов - потокобезопасная.
Никак не найду пруф. Можно ссылку?
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
12.06.2015, 23:12
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
Никак не найду пруф. Можно ссылку?
Он у нас не особо быстрый.. придётся подождать... года два.... -три.....
0
Игогошка!
 Аватар для ct0r
1801 / 708 / 44
Регистрация: 19.08.2012
Сообщений: 1,367
12.06.2015, 23:59
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
Никак не найду пруф. Можно ссылку?
Начиная с С++11:
Цитата Сообщение от Standard 6.7 p4
If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.06.2015, 23:59
Помогаю со студенческими работами здесь

Синглтон для лог файла!
#include &lt;iostream&gt; #include &lt;cmath&gt; #include &lt;limits&gt; #include &lt;stdio.h&gt; #include &lt;math.h&gt; #include &lt;fstream&gt; using namespace...

Синглтон и время его жизни
Создл синглтон, его задача прочитать конфигурационный файл в переменную records и давать возможность обращаться к нему по мере надобности. ...

Синглтон и стиль написания кода (теория)
В общем, тут диспут о правильном написании кода. Я знаю что такое синглтон, для чего он нужен и как реализуется. Однако меня...

Синглтон Мейерса, нужны некоторые пояснения
class Singleton{ public: static Singleton&amp; init() { static Singleton Object; return Object; } ...

Мой синглтон. Дайте рекомендации, оцените, пожалуйста
Доброе утро! Вот, наваял тут типа синглтон. Можете дать замечания по данной реализации. Спасибо! //...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Новые блоги и статьи
Автоматическое создание документа при проведении другого документа
Maks 29.03.2026
Реализация из решения ниже выполнена на нетиповых документах, разработанных в конфигурации КА2. Есть нетиповой документ "ЗаявкаНаРемонтСпецтехники" и нетиповой документ "ПланированиеСпецтехники". В. . .
Настройка движения справочника по регистру сведений
Maks 29.03.2026
Решение ниже реализовано на примере нетипового справочника "ТарифыМобильнойСвязи" разработанного в конфигурации КА2, с целью учета корпоративной мобильной связи в коммерческом предприятии. . . .
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru