Здравствуйте, Аноним, Вы писали:
А>Как мне добиться, чтобы во время создания объекта класса MyClass А>(вообще говоря, в другом модуле) объект mutex уже был создан?
Создай заранее служебный объект класса MyClass, иначе, по-моему, не получится...
Или сделай мьютекс глобальным...
А>Как мне добиться, чтобы во время создания объекта класса MyClass А>(вообще говоря, в другом модуле) объект mutex уже был создан?
Имеются ввиду глобальные объекты класса MyClass?
А>Как мне добиться, чтобы во время создания объекта класса MyClass А>(вообще говоря, в другом модуле) объект mutex уже был создан?
могу ошибаться,но ко времени создания объекта MyClass статический объект уже будет существовать и без дополнительбных телодвижений с твоей стороны.
Удачи тебе, браток!
Re[2]: Порядок создания объектов
От:
Аноним
Дата:
02.11.04 08:52
Оценка:
Здравствуйте, Bell, Вы писали:
B>Имеются ввиду глобальные объекты класса MyClass?
Дело не в этом. Заранее я не знаю, как будут объявляться (или определяться?) объекты. Главное — чтобы во время вызова конструктора MyClass объект класса TMutex уже существовал. Способ Анатолия Широкова подходит.
Re[2]: Порядок создания объектов
От:
Аноним
Дата:
02.11.04 08:55
Оценка:
Здравствуйте, Glоbus, Вы писали:
G>могу ошибаться,но ко времени создания объекта MyClass статический объект уже будет существовать и без дополнительбных телодвижений с твоей стороны.
Действительно ошибаешься. Программа уже гуляет где-то, а мьютекса все нет
А>Как мне добиться, чтобы во время создания объекта класса MyClass А>(вообще говоря, в другом модуле) объект mutex уже был создан?
функциональный синглтон, создаст объект при первом обращении:
TMutex& global_mutex() {
static TMutex t;
return t;
}
...
// и в программе везде юзаешь:
global_mutex().TryLock();
получишь глобальный в пределах бинарника статический экземпляр мютекса,
вся эта кухня будет корректно работать даже на границах между бинарниками (из других DLL).
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Bell, Вы писали:
B>>Имеются ввиду глобальные объекты класса MyClass?
А>Дело не в этом. Заранее я не знаю, как будут объявляться (или определяться?) объекты. Главное — чтобы во время вызова конструктора MyClass объект класса TMutex уже существовал. Способ Анатолия Широкова подходит.
Все не так просто.
Предположим, что имеется 2 потока, и эти 2 потока одновременно создают по экземрляру MyClass, соответственно в их конструкторах имеем одновременный вызов get_mutex, а это может окончится не очень хорошо...
Здравствуйте, Bell, Вы писали:
B>Все не так просто. B>Предположим, что имеется 2 потока, и эти 2 потока одновременно создают по экземрляру MyClass, соответственно в их конструкторах имеем одновременный вызов get_mutex, а это может окончится не очень хорошо...
Да, ты бы был прав, если бы не одно "но". У человека там конфликты возникают в момент инициализации модулей, т.е. в телах конструкторов статических объектов. Прежде, чем у тебя появиться возможность создать второй поток, этот мютекс (именно рассматриваемй случай), будет уже создан.
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Bell, Вы писали:
B>>Все не так просто. B>>Предположим, что имеется 2 потока, и эти 2 потока одновременно создают по экземрляру MyClass, соответственно в их конструкторах имеем одновременный вызов get_mutex, а это может окончится не очень хорошо...
V>Да, ты бы был прав, если бы не одно "но". У человека там конфликты возникают в момент инициализации модулей, т.е. в телах конструкторов статических объектов. Прежде, чем у тебя появиться возможность создать второй поток, этот мютекс (именно рассматриваемй случай), будет уже создан.
Вот поэтому в своем первом вопросе я и спросил — о глобальных объектах речь, или нет. Из текста вопроса совсем не очевидно, что речь о них.
Любите книгу — источник знаний (с) М.Горький
Re: Порядок создания объектов
От:
Аноним
Дата:
02.11.04 12:38
Оценка:
Здравствуйте, Аноним, Вы писали:
А>Есть такой текст:
А>Как мне добиться, чтобы во время создания объекта класса MyClass А>(вообще говоря, в другом модуле) объект mutex уже был создан?
У Александреску эта тема довольно подробно рассмотрена (глава про синглтоны).
Здравствуйте, vdimas, Вы писали: V>функциональный синглтон, создаст объект при первом обращении:
V>
V>TMutex& global_mutex() {
V> static TMutex t;
V> return t;
V>}
V>...
V>// и в программе везде юзаешь:
V>global_mutex().TryLock();
V>
V>получишь глобальный в пределах бинарника статический экземпляр мютекса, V>вся эта кухня будет корректно работать даже на границах между бинарниками (из других DLL).
Насколько я помню, вызов конструктора статической переменной может отложиться до первого вызова любой функции,
определенной в том же TU. Это может произойти после вызова main, когда у тебя уже >1 потока.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, Аноним, Вы писали:
А>>Есть такой текст:
А>>Как мне добиться, чтобы во время создания объекта класса MyClass А>>(вообще говоря, в другом модуле) объект mutex уже был создан?
А>У Александреску эта тема довольно подробно рассмотрена (глава про синглтоны).
Здравствуйте, alnsn, Вы писали:
A>Насколько я помню, вызов конструктора статической переменной может отложиться до первого вызова любой функции, A>определенной в том же TU. Это может произойти после вызова main, когда у тебя уже >1 потока.
а речь идет о статической переменной, или глобальной?
Здравствуйте, vdimas, Вы писали:
V>Здравствуйте, Bell, Вы писали:
B>>Все не так просто. B>>Предположим, что имеется 2 потока, и эти 2 потока одновременно создают по экземрляру MyClass, соответственно в их конструкторах имеем одновременный вызов get_mutex, а это может окончится не очень хорошо...
V>Да, ты бы был прав, если бы не одно "но". У человека там конфликты возникают в момент инициализации модулей, т.е. в телах конструкторов статических объектов. Прежде, чем у тебя появиться возможность создать второй поток, этот мютекс (именно рассматриваемй случай), будет уже создан.
А что если статические объекты в конструкторе создают потоки?
vdimas wrote:
> Здравствуйте, alnsn, Вы писали: > > A>Насколько я помню, вызов конструктора статической переменной может отложиться до первого вызова любой функции, > A>определенной в том же TU. Это может произойти после вызова main, когда у тебя уже >1 потока. > > а речь идет о статической переменной, или глобальной?
Здесь это не так важно.
function static — хороший способ создания проблем в многопотоковом коде. Сегодня у тебя этот static инициализирует один поток, завтра — ?, и компилятор здесь тебе не поможет никакой диагностикой.