Шаблон проектирования Singleton (одиночка), подбираю подходящий для моей задачи |
Здравствуйте, гость ( Вход | Регистрация )
Шаблон проектирования Singleton (одиночка), подбираю подходящий для моей задачи |
Litkevich Yuriy |
27.9.2009, 21:16
Сообщение
#31
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
В итоге получилось так:
singleton.h
singleton.cpp
|
|
|
Влад |
27.9.2009, 21:47
Сообщение
#32
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
Юрий, по твоей реализации (кстати, практически классической!) у меня только два замечания:
1. конструкторы-деструкторы, которые ты хочешь скрыть, не обязательно реализовывать с пустым телом {}, достаточно просто объявить их private; 2. учти, что эта реализация работает только в строго однопоточной модели! В многопоточной ты либо "влетишь", либо надо реализовывать Double-Check Locking. Это, впрочем, тоже классика. А так ничего, вполне себе красиво!... |
|
|
Litkevich Yuriy |
27.9.2009, 23:17
Сообщение
#33
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
1. конструкторы-деструкторы, которые ты хочешь скрыть, не обязательно реализовывать с пустым телом {}, достаточно просто объявить их private; они у меня с пустым телом, т.к. в моём применении они были не нужны.надо реализовывать Double-Check Locking. имеется в виду для основных переменных "Одиночки" (*p_this и cnt)?
|
|
|
AD |
27.9.2009, 23:56
Сообщение
#34
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
1. конструкторы-деструкторы, которые ты хочешь скрыть, не обязательно реализовывать с пустым телом {}, достаточно просто объявить их private; они у меня с пустым телом, т.к. в моём применении они были не нужны.Ну вот, раз не нужны, то можно объявлять вообще без тела! имеется в виду для основных переменных "Одиночки" (*p_this и cnt)? Нет. В смысле сделать так:
|
|
|
Влад |
28.9.2009, 11:23
Сообщение
#35
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
Не совсем так. Правильный (имхо) пример кода приведен ниже:
|
|
|
Litkevich Yuriy |
28.9.2009, 18:45
Сообщение
#36
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
Влад, поясни пожалуйста свой код.
И m_cs что такое? |
|
|
AD |
28.9.2009, 20:25
Сообщение
#37
|
Профессионал Группа: Участник Сообщений: 2003 Регистрация: 4.2.2008 Из: S-Petersburg Пользователь №: 84 Спасибо сказали: 70 раз(а) Репутация: 17 |
|
|
|
Litkevich Yuriy |
28.9.2009, 20:29
Сообщение
#38
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
AD, указатель в его примере - m_me
|
|
|
Влад |
28.9.2009, 20:46
Сообщение
#39
|
Участник Группа: Участник Сообщений: 146 Регистрация: 20.3.2009 Из: Санкт-Петербург Пользователь №: 627 Спасибо сказали: 46 раз(а) Репутация: 8 |
Ага, этот пример кода выдран с корнем из реально работающего (уж года два как... в режиме 24x7) проекта. m_me - это как раз и есть объект-одиночка, а m_cs - это объект блокировки (под MFC это критическая секция, но, в принципе, с таким же точно успехом при минимальной модификации кода может быть и posix-ный mutex). В коде принципиально, что m_me должен быть именно volatile.
Это - просто пример реализации идиомы Double-Checked Locking, а более подробно о ней может рассказать и гугл; по-моему, тема подробно освещена у классиков типа Мейерса, Саттера.... вот только не помню, у кого точно. Сообщение отредактировал Влад - 28.9.2009, 20:49 |
|
|
Litkevich Yuriy |
28.9.2009, 21:13
Сообщение
#40
|
разработчик РЭА Группа: Сомодератор Сообщений: 9669 Регистрация: 9.1.2008 Из: Тюмень Пользователь №: 64 Спасибо сказали: 807 раз(а) Репутация: 94 |
|
|
|
Текстовая версия | Сейчас: 2.12.2024, 5:46 |