Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
21.12.2013, 21:05     Потокобезобасный синглтон #1
Имеется следующий драфт синглтона с отложенной инициализацией:
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);
 }
а также корректно ли сделан замок для операции вставки?
Заранее спасибо.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.12.2013, 21:05     Потокобезобасный синглтон
Посмотрите здесь:

Синглтон C++
как удалить синглтон? JavaScript
Замена статического класса на объект-синглтон приводит к отказу работать C#
C# Что такое синглтон в C#?
Корзина синглтон PHP ООП
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.12.2013, 21:19     Потокобезобасный синглтон #2
в новом стандарте инициализация статических объектов - потокобезопасная.
поэтому сгодится синглтон мейерса.

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 юзать.
Gorillych
14 / 14 / 1
Регистрация: 04.07.2013
Сообщений: 76
21.12.2013, 21:28  [ТС]     Потокобезобасный синглтон #3
Цитата Сообщение от 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;
}
Это безопасно будет?
DU
1477 / 1053 / 45
Регистрация: 05.12.2011
Сообщений: 2,279
21.12.2013, 21:38     Потокобезобасный синглтон #4
поинтер не обазятельно. можно и просто объект.
на счет безопастности - с точки зрения компилятора разницы нет. в обоих случаях это
инициализация какого-то статического объекта. просто типы у них отличаются.
но я могу и ошибаться. стандарт на эту тему я не ковырял, просто в книге одной вычитал.

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

Автор: Энтони Уильямс
Переводчик: А. Слинкин
Языки: Русский
Издательство: ДМК Пресс
ISBN 978-5-94074-448-1; 2012 г.
http://www.ozon.ru/context/detail/id/17636939/
ArmanPrestige
 Аватар для ArmanPrestige
219 / 210 / 50
Регистрация: 15.01.2013
Сообщений: 788
12.06.2015, 23:07     Потокобезобасный синглтон #5
Цитата Сообщение от DU Посмотреть сообщение
в новом стандарте инициализация статических объектов - потокобезопасная.
Никак не найду пруф. Можно ссылку?
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
12.06.2015, 23:12     Потокобезобасный синглтон #6
Цитата Сообщение от ArmanPrestige Посмотреть сообщение
Никак не найду пруф. Можно ссылку?
Он у нас не особо быстрый.. придётся подождать... года два.... -три.....
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
12.06.2015, 23:59     Потокобезобасный синглтон
Еще ссылки по теме:

C++ Мой синглтон. Дайте рекомендации, оцените, пожалуйста
C++ Синглтон для лог файла!
В проекте "Фильмы" реализовать три паттерна: адаптер, синглтон, прокси C#

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

Или воспользуйтесь поиском по форуму:
ct0r
C++/Haskell
 Аватар для ct0r
1549 / 568 / 39
Регистрация: 19.08.2012
Сообщений: 1,174
Завершенные тесты: 1
12.06.2015, 23:59     Потокобезобасный синглтон #7
Цитата Сообщение от 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.
Yandex
Объявления
12.06.2015, 23:59     Потокобезобасный синглтон
Ответ Создать тему
Опции темы

Текущее время: 00:57. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru