Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / инициализация глобального ресурса в многопоточном приложении / 10 сообщений из 10, страница 1 из 1
17.12.2007, 14:55:02
    #35014850
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация глобального ресурса в многопоточном приложении
Для инициализации общего ресурса использую прием заимствованный у Майерса, который гарантирует инициализацию переменной при первом вызове:
Код: plaintext
1.
2.
3.
4.
5.
6.
// на примере обертки критической секции:
CRITICAL_SECTION& spl_section()
{
	static CriticalSection spl_sec;
	return spl_sec.Get();
}

когда к такому коду могут обратиться сразу несколько потоков, то он становится не безопасным.

Сейчас делаю холостой вызов этой ф-ии, чтобы проинициализировать переменную до запуска др. потоков (насколько будет безопасным синхронное обращение после предварительной инициализации пока не знаю, думаю проблем не будет).

Вопрос: есть ли способ(ы) привести подобную ф-ию к безопасному виду для многопоточности без использование предварительной инициализации путем холостого вызова?
...
Рейтинг: 0 / 0
17.12.2007, 15:03:34
    #35014887
Cerebrum
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация глобального ресурса в многопоточном приложении
Tubrik...

все зависит от реализации, но если в секции храниться какое-нибудь простое выражение, то в принципе можно использовать InterlockedIncrement
...
Рейтинг: 0 / 0
17.12.2007, 15:18:06
    #35014931
blinded
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация глобального ресурса в многопоточном приложении
Насколькоя знаю такое не пройдет. придется работать со статическим указателем и double check locking/ а еще лучше поситать Александреску
...
Рейтинг: 0 / 0
17.12.2007, 15:42:48
    #35015024
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация глобального ресурса в многопоточном приложении
В этом подходе это в принципе не возможно. Должен существовать какой-нибудь блокиратор, для создания твоего блокиратора. :) И т.д. - рекурсия.
...
Рейтинг: 0 / 0
17.12.2007, 15:51:24
    #35015069
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация глобального ресурса в многопоточном приложении
Значит холостой вызов и точка, если я вас правильно понял.
...
Рейтинг: 0 / 0
17.12.2007, 16:03:52
    #35015127
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация глобального ресурса в многопоточном приложении
TubrikЗначит холостой вызов и точка, если я вас правильно понял.

Создай статический класс, который в конструкторе будет дергать эту функцию. Т.о. инициализация у тебя будет проходить в dynamic initialization этапе.
...
Рейтинг: 0 / 0
17.12.2007, 17:03:26
    #35015396
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация глобального ресурса в многопоточном приложении
Akh TubrikЗначит холостой вызов и точка, если я вас правильно понял.

Создай статический класс, который в конструкторе будет дергать эту функцию. Т.о. инициализация у тебя будет проходить в dynamic initialization этапе.

Такой вариант тоже не пойдет, мне кажется, т.к. нет гарантии, что этот статический класс будет инициализирован раньше др. объекта, в котором он может использоваться в качестве начальных данных инициализации этого объекта. Как вы сказали, имеем бесконечную зависимость.

Вообщем все ясно, спасибо за ответы.
...
Рейтинг: 0 / 0
18.12.2007, 06:40:41
    #35016401
tsipa
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация глобального ресурса в многопоточном приложении
погугли на слова multithreaded singleton
...
Рейтинг: 0 / 0
18.12.2007, 09:42:38
    #35016582
Akh
Akh
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация глобального ресурса в многопоточном приложении
Tubrik Akh TubrikЗначит холостой вызов и точка, если я вас правильно понял.

Создай статический класс, который в конструкторе будет дергать эту функцию. Т.о. инициализация у тебя будет проходить в dynamic initialization этапе.

Такой вариант тоже не пойдет, мне кажется, т.к. нет гарантии, что этот статический класс будет инициализирован раньше др. объекта, в котором он может использоваться в качестве начальных данных инициализации этого объекта. Как вы сказали, имеем бесконечную зависимость.

Вообщем все ясно, спасибо за ответы.

Если объекты будут юзать в main()-е, то все будет ок.
...
Рейтинг: 0 / 0
18.12.2007, 17:44:26
    #35018544
White Owl
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
инициализация глобального ресурса в многопоточном приложении
TubrikЗначит холостой вызов и точка, если я вас правильно понял.А чем тебе не нравится холостой вызов? Если ресурс глобален, значит он существует уже в момент стартапа. Вот в стартапе его и инициализируй. На экран заставку "грузимся" а в фоне загружаешь свои глобальные объекты. Стандартный, проверенный временем подход.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / инициализация глобального ресурса в многопоточном приложении / 10 сообщений из 10, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]