На сколько я знаю компилятор инстанцирует class2 только при первом обращении к функции SomeFunc().
Является ли это инстанцирование tread-safe'ым если приложение многопоточное? Не возникнет ли состояние
гонок при вызове конструктора SomeClass2::SomeClass2?
Здравствуйте, Serg_swamp, Вы писали:
S_>... S_>На сколько я знаю компилятор инстанцирует class2 только при первом обращении к функции SomeFunc(). S_>Является ли это инстанцирование tread-safe'ым если приложение многопоточное? Не возникнет ли состояние S_>гонок при вызове конструктора SomeClass2::SomeClass2?
Если использовать многопоточную версию CRT, проблем не будет.
> void SomeClass::SomeFunc()
> {
> static SomeClass2 class2;
> // use class2 member
> }
>
> На сколько я знаю компилятор инстанцирует class2 только при первом обращении к функции SomeFunc(). > Является ли это инстанцирование tread-safe'ым если приложение многопоточное?
Зависит от реализации. Обычно -- нет.
> Не возникнет ли состояние гонок при вызове конструктора SomeClass2::SomeClass2?
Может. Лучше инициализацию синхронизировать.
Posted via RSDN NNTP Server 2.0
Легче одурачить людей, чем убедить их в том, что они одурачены. — Марк Твен
Здравствуйте, Павел Кузнецов, Вы писали:
>> Не возникнет ли состояние гонок при вызове конструктора SomeClass2::SomeClass2?
ПК>Может. Лучше инициализацию синхронизировать.
А если и предполагается инициализировать объект синхронизации?
Синхронизировать предполагается только одну статическую функцию из всего класса.
Не хотелось бы делать объект синхронизации членом класса. Да и дополнительные депенденсы в хедере хотелось бы исключить.
Изначально предполагалось сделать объект синхронизации статическим членом класса,
но потом пришёл в голову такой вариант. Поэтому захотелось узнать о безопасности такого решения.
Здравствуйте, Serg_swamp, Вы писали:
S_>Здравствуйте, Павел Кузнецов, Вы писали:
>>> Не возникнет ли состояние гонок при вызове конструктора SomeClass2::SomeClass2?
ПК>>Может. Лучше инициализацию синхронизировать.
S_>А если и предполагается инициализировать объект синхронизации?
Инициализируй его до main(). В этот момент должен работать только один поток.
S_>Синхронизировать предполагается только одну статическую функцию из всего класса.
Здравствуйте, Шахтер, Вы писали:
Ш>Инициализируй его до main(). В этот момент должен работать только один поток.
Инициализировать до main не получиться. Т.к. функция может не когда и не вызываться, а держать просто так объект ядра не хотелось бы.
Ш>Сделай объект синхронизации статическим объектом.
Он и так статический.
Ш>Если предполагается вызов Function до или после main(), то добавь флажок готовности.
Ш>
Здравствуйте, Dmitry Kotlyarov, Вы писали:
S_>>На сколько я знаю компилятор инстанцирует class2 только при первом обращении к функции SomeFunc(). S_>>Является ли это инстанцирование tread-safe'ым если приложение многопоточное? Не возникнет ли состояние S_>>гонок при вызове конструктора SomeClass2::SomeClass2?
DK>Если использовать многопоточную версию CRT, проблем не будет.
Это утверждение чем-нибудь мотивировано?
Вроде как никто ничего про многопоточное окружение в таком случае не обещает
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Здравствуйте, Serg_swamp, Вы писали:
S_>Здравствуйте, Шахтер, Вы писали:
Ш>>Инициализируй его до main(). В этот момент должен работать только один поток.
S_>Инициализировать до main не получиться. Т.к. функция может не когда и не вызываться, а держать просто так объект ядра не хотелось бы.
Я не думаю, что на этом нужно экономить.
S_>Спасибо за код, но я использую не совсем Win32 объекты синхронизации и классы S_>автоблокировки/разблокировки уже есть в библиотеки которую я использую.
Дак какая разница? Важен принцип решения задачи, а средства его решения могут быть разными.
S_>P.S. ИМХО твой класс FlagSwitch имеет состояние гонки т.к. изменение флага не
атомарная операция.
Оно происходит до main и после main, я предполагаю, что в это время работает только один поток.
По поводу дополнительного синхронизирующего объекта.
Можно за счет довольно серьёзного усложнения кода сделать так, чтобы он конструировался только при первом вызове функции. На мой взгляд это нецелесообразно, т.к. экономия здесь явно не стоит трудозатрат.