![]() |
Модераторы: feodorv, GremlinProg, xvr, Fixin |
![]() ![]() ![]() |
|
lv151 |
|
||||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: 1 Всего: 2 |
Как правильно инициализировать (InitializeCriticalSection) критическую секцию синглетона?
Создавать глобальную переменную или делать обвёртку для CRITICAL_SECTION?
|
||||
|
|||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Обертка (которая делает нечто объектом и реализует паттерн "захват ресурса есть инициализация" или как он там правильно называется) - завсегда лучше, чем голый АПИ - независимо от цели использования.
Добавлено через 5 минут и 36 секунд Только вот помнится мне, что "настоящий" потокобезопасный синглетон выглядит посложнее, чем у тебя... да вот не помню, где я его видела, увы... -------------------- ... |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
lv151
Для singleton-а критическая секция не лучшее решение. При каждом обращении к синглтону критическая секция будет блокироваться, хотя объект уже создан и в синхронизации вызов не нуждается. Если нужно именно для windows, то посмотри в сторону One-Time Initialization. В boost есть кросс-платформенная обертка. |
|||
|
||||
lv151 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: 1 Всего: 2 |
BOOL WINAPI TryEnterCriticalSection(
__in_out LPCRITICAL_SECTION lpCriticalSection ); А если вместо EnterCriticalSection использовать TryEnterCriticalSection, по-ходу она не блокирует. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
||||
|
||||
lv151 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: 1 Всего: 2 |
Вот засада.
Остановился пока на критической секции. Сделал её глобальной переменной.
Это сообщение отредактировал(а) lv151 - 7.11.2011, 11:58 |
|||
|
||||
GremlinProg |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2706 Регистрация: 9.8.2005 Где: Тюмень Репутация: 99 Всего: 106 |
-------------------- "Гений всегда разумнее, чем умнее. Ум — это машина, разум — водитель этой машины." |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
Нет, я имела в виду книгу... то ли "Эффективное использование С++", то ли что-то вроде...
Что касается сабжа, то критическая секция - самая легкая из блокировок; если обращение к синглетону происходит нечасто, то можно пренебречь легкой неэффективностью. Но если это критично - как раз этому и была посвящена та реализация, которую я не помню. Вроде как-то так: блокировку вносим внутрь if (!instance); но после входа в критическую секцию нужно проверить еще раз, ибо кто-то мог уж инициализировать, пока мы ждали своей очереди. При этом предполагается, что синглетон не уничтожается. -------------------- ... |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 5 Всего: 211 |
Earnest
Ты говоришь про double-checked locking pattern, который не реализуется в текущем стандарте. Об этом ты и читала у Майерса и Александреску ![]() Вот еще на русском. |
|||
|
||||
Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 33 Всего: 183 |
azesmcar, да, спасибо, теперь вспомнила.
Помнится, тогда я еще решила не париться и приняла меры, чтобы мои синглетоны инициализировались исключительно в главном потоке, и благополучно забыла о проблемах double-checked locking. Чего и автору темы желаю. ![]() -------------------- ... |
|||
|
||||
lv151 |
|
|||
Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 916 Регистрация: 11.2.2008 Репутация: 1 Всего: 2 |
Спасибо!
|
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Системное программирование и WinAPI" | |
|
На данный раздел распространяются Правила форума и Правила раздела С++:Общие вопросы . Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Chipset, Step, Fixin, GremlinProg, xvr. feodorv. |
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Системное программирование и WinAPI | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |