|
|
Регистрация Восстановить пароль |
Повторная активизация e-mail |
Регистрация | Задать вопрос |
Заплачу за решение |
Новые сообщения |
Сообщения за день |
Расширенный поиск |
Правила |
Всё прочитано |
|
|
Опции темы | Поиск в этой теме |
06.09.2014, 07:06 | #1 |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Здравствуйте. У GoF для шаблона Singleton написано, что конкретно для языка С++ будет проблема в случае если синглетоны зависят друг от друга по причине того, что САБЖ не регламентирован по стандарту.
Собственно, я вроде бы представляю себе проблему, но не понимаю как она к синглетону относится. Ведь порядок вызова конструкторов будет полностью определяется порядком вызова статических функций-членов instance(). Разве нет? И вот ведь в случае Код:
Переместите тему в общие вопросы С++ ? From Stilet: Готово. Последний раз редактировалось Stilet; 06.09.2014 в 10:36. |
06.09.2014, 10:41 | #2 |
Белик Виталий :)
Старожил
Регистрация: 23.07.2007
Сообщений: 57,097
|
Я лично не в курсе таких дебрей, потому... сумимасен, короче
I'm learning to live...
|
06.09.2014, 13:16 | #3 |
Старожил
Регистрация: 13.07.2012
Сообщений: 6,331
|
Речь идет о глобальных переменных - порядок вызова их конструкторов не определен.
Кстати, статичные переменные внутри функции могут быть граблями при многопоточном использовании. |
06.09.2014, 14:04 | #4 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
rrrFer
Вкратце суть: Если ваша программа с завидным постоянством падает при завершении - вы утратили контроль за сложностью вашего проекта. Или может быть просто не умеете сингелтоны. Вкратце суть: Это удивительно, но я встречал множество программистов, которые на вопрос: "зачем это нужно" отвечали: "я хочу все контролировать". Это удивительно вдвойне, потому что как минимум один из моих коллег однажды уже обжегся: вылезли ошибки, разобраться с которыми было не просто. И даже дал согласие на замену ручного привода автоматикой, лишь бы избавиться от проблем. Но через несколько месяцев он опять заявил: "я хочу все контролировать". Проблема инициализации: Код:
Либо для сингелтонов с ручным приводом: Код:
На мой взгляд: оба варианта в топку. Во-первых: не безопасно. А во-вторых, и это самое главное: нет ни одной причины делать вручную, если за вас тоже самое может сделать умная автоматика: Код:
Время жизни и очередность созданияуничтожения: Если в конструкторе сингелтон1 вызвать сингелтон2, то возникнет следующая ситуация: На время работы конструктора сингелтон1, его как объекта ещё не существует. Но поскольку он уже позвал сингелтон2, то получается, что сингелтон2 гарантированно был создан раньше, а значит проживет дольше: Код:
А значит, гарантированно проживет дольше,чем сингелтон1 А значит, сингелтон1, который позвал другой сингелтон в своем конструкторе, теперь имеет возможность совершенно безопасно его эксплуатировать на всем времени своей жизни. Созависимость сингелтонов: Рассмотрим код: singelton1.h Код:
Код:
Код:
Код:
Каким же тогда получится порядок инициализации и время жизни этих сингелтонов? Ответ: unspecified behavior Зависит от того, какой сингелтон: первый или второй позвали первым. Если первым позвали singelton1, значит первым построится singelton2, и наоборот. Код:
Код:
То бишь, независимо от причуд вызывающей стороны, порядок создания и время жизни сингелтонов будет определено так, что бы все отработало без ошибок. Вы не сможете закладываться на четко-определенный порядок, но можете закладываться, что "все будет хорошо". Последний раз редактировалось _Bers; 06.09.2014 в 14:12. |
06.09.2014, 14:08 | #5 |
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
|
06.09.2014, 14:23 | #6 | ||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
_Bers, ну понятно, я вроде бы так и думал.
Про взаимозависимости я особо не спрашивал, меня больше границы единиц трансляции интересовали. Вопрос возник лишь потому, что GoF пишет о том, что в С++ будут проблемы, хотя в реализации, которую они предлагают проблемы нет. У них такой вариант вроде бы был: Код:
На insidecpp говорят что при отложенной инициализации (как в примере выше) проблемы нет, но у синглетона Меерса она есть: Цитата:
Цитата:
Код:
Спасибо. Про взаимозависимости написали здорово, хотя ИМХО без кода, на пальцах оно МБ было бы более наглядно Последний раз редактировалось rrrFer; 06.09.2014 в 14:25. |
||
06.09.2014, 14:34 | #7 | ||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Может быть банда просто не осилила плюсы? Цитата:
Тогда это значит, что проблемы есть у insidecpp. А если они имели ввиду именно "как в примере выше" - у них точно проблема. Проблема с языком, которого они не понимают. Да. Последний раз редактировалось _Bers; 06.09.2014 в 14:36. |
||
06.09.2014, 17:21 | #8 | ||
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
Цитата:
Кстати, навоял статью по теме: http://pro-prof.com/archives/1546 (еще вчера), но вот тема зависимостей между синглтонами (когда нужен определенный порядок инициализации) там оказалась не раскрыта... (вы тут описали лучше xD). Последний раз редактировалось rrrFer; 06.09.2014 в 17:23. |
||
06.09.2014, 17:34 | #9 | |||
Старожил
Регистрация: 16.12.2011
Сообщений: 2,329
|
Цитата:
Не знаю насчет "прям везде", потому что "прям везде" я таких деццких поделий не встречал. Встречал, например у Александресску описание разных моделей. В том числе - Феникс (умеет подохнуть когда вы ему скажите. Но если следом опять позовёте - он автоматом опять поднимется). К счастью, на практике, в чужом коде, я все таки чаще встречаю простой и безопасный локальный статик, а не переусложненную, либо небезопасную ботву. Цитата:
Локальная статическая переменная инициализируется при первом запуске функции-хозяина. Если вы её не позовете - конструктор локального статика так же вызван не будет. Цитата:
Хорошая новость в том, что техника "феникс" не противоречит технике "локальный статик". Одно другому не мешает. |
|||
06.09.2014, 19:07 | #10 | |
Санитар
Старожил
Регистрация: 04.10.2008
Сообщений: 2,577
|
Цитата:
|
|
|
Похожие темы | ||||
Тема | Автор | Раздел | Ответов | Последнее сообщение |
Переход границы через курсор мышки | Акоб | Паскаль, Turbo Pascal, PascalABC.NET | 8 | 26.11.2011 16:19 |
Порядок вызова процедуры | artem611 | Помощь студентам | 3 | 11.05.2011 18:28 |
Получить границы диапазона через InputBox | kipish_lp | Microsoft Office Excel | 4 | 18.08.2010 14:14 |
Порядок рисования объектов ? | HWork | Gamedev - cоздание игр: Unity, OpenGL, DirectX | 1 | 13.03.2010 07:47 |
Z-порядок расположения объектов. | Alex Cones | Мультимедиа в Delphi | 1 | 19.04.2009 14:08 |