Порядок создания объектов
От: Аноним  
Дата: 02.11.04 08:26
Оценка:
Есть такой текст:


class MyClass {
public:
  MyClass();
  static TMutex mutex;
};
...

TMutex MyClass::mutex;


Как мне добиться, чтобы во время создания объекта класса MyClass
(вообще говоря, в другом модуле) объект mutex уже был создан?
Re: Порядок создания объектов
От: KneLL Украина  
Дата: 02.11.04 08:30
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такой текст:


А>
А>class MyClass {
А>  static TMutex mutex;
А>};
А>...

А>TMutex MyClass::mutex;
А>


Насколько я помню стандарт не определяет порядок инициализации статических членов в разных модулях. Зависит от компилятора.
Re: Порядок создания объектов
От: Анатолий Широков СССР  
Дата: 02.11.04 08:30
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Есть такой текст:



А>
А>class MyClass {
А>public:
А>  MyClass();
А>  static TMutex& get_mutex()
    {
        static TMutex mutex;
        return mutex; 
    }
А>};

А>


А>Как мне добиться, чтобы во время создания объекта класса MyClass

А>(вообще говоря, в другом модуле) объект mutex уже был создан?
Re: Порядок создания объектов
От: e-smirnov  
Дата: 02.11.04 08:32
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как мне добиться, чтобы во время создания объекта класса MyClass

А>(вообще говоря, в другом модуле) объект mutex уже был создан?

Создай заранее служебный объект класса MyClass, иначе, по-моему, не получится...
Или сделай мьютекс глобальным...
Re: Порядок создания объектов
От: Bell Россия  
Дата: 02.11.04 08:35
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такой текст:



А>
А>class MyClass {
А>public:
А>  MyClass();
А>  static TMutex mutex;
А>};
А>...

А>TMutex MyClass::mutex;
А>


А>Как мне добиться, чтобы во время создания объекта класса MyClass

А>(вообще говоря, в другом модуле) объект mutex уже был создан?
Имеются ввиду глобальные объекты класса MyClass?
Любите книгу — источник знаний (с) М.Горький
Re[2]: Порядок создания объектов
От: Аноним  
Дата: 02.11.04 08:46
Оценка:
Здравствуйте, Анатолий Широков.

Спасибо. То, что надо!
Re[2]: Порядок создания объектов
От: MaximE Великобритания  
Дата: 02.11.04 08:51
Оценка: :)
On Tue, 02 Nov 2004 08:30:15 GMT, Анатолий Широков <12237@news.rsdn.ru> wrote:

> А>
> А>class MyClass {
> А>public:
> А>  MyClass();
> А>  static TMutex& get_mutex()
>     {
>         static TMutex mutex;
>         return mutex;
>     }
> А>};
>
> А>


У меня есть подозрение, что человек создает мьютекс именно в малтифредовой проге А такой код совсем не thread safe.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Re: Порядок создания объектов
От: Glоbus Украина  
Дата: 02.11.04 08:52
Оценка:
Здравствуйте, Аноним, Вы писали:


А>Как мне добиться, чтобы во время создания объекта класса 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 статический объект уже будет существовать и без дополнительбных телодвижений с твоей стороны.


Действительно ошибаешься. Программа уже гуляет где-то, а мьютекса все нет
Re: Порядок создания объектов
От: vdimas Россия  
Дата: 02.11.04 08:59
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такой текст:



А>
А>class MyClass {
А>public:
А>  MyClass();
А>  static TMutex mutex;
А>};
А>...

А>TMutex MyClass::mutex;
А>


А>Как мне добиться, чтобы во время создания объекта класса MyClass

А>(вообще говоря, в другом модуле) объект mutex уже был создан?

функциональный синглтон, создаст объект при первом обращении:

TMutex& global_mutex() {
    static TMutex t;
    return t;
}

...

// и в программе везде юзаешь:

global_mutex().TryLock();


получишь глобальный в пределах бинарника статический экземпляр мютекса,
вся эта кухня будет корректно работать даже на границах между бинарниками (из других DLL).
Re[3]: Порядок создания объектов
От: Bell Россия  
Дата: 02.11.04 09:02
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Bell, Вы писали:


B>>Имеются ввиду глобальные объекты класса MyClass?


А>Дело не в этом. Заранее я не знаю, как будут объявляться (или определяться?) объекты. Главное — чтобы во время вызова конструктора MyClass объект класса TMutex уже существовал. Способ Анатолия Широкова подходит.


Все не так просто.
Предположим, что имеется 2 потока, и эти 2 потока одновременно создают по экземрляру MyClass, соответственно в их конструкторах имеем одновременный вызов get_mutex, а это может окончится не очень хорошо...
Любите книгу — источник знаний (с) М.Горький
Re[4]: Порядок создания объектов
От: vdimas Россия  
Дата: 02.11.04 10:25
Оценка:
Здравствуйте, Bell, Вы писали:

B>Все не так просто.

B>Предположим, что имеется 2 потока, и эти 2 потока одновременно создают по экземрляру MyClass, соответственно в их конструкторах имеем одновременный вызов get_mutex, а это может окончится не очень хорошо...

Да, ты бы был прав, если бы не одно "но". У человека там конфликты возникают в момент инициализации модулей, т.е. в телах конструкторов статических объектов. Прежде, чем у тебя появиться возможность создать второй поток, этот мютекс (именно рассматриваемй случай), будет уже создан.
Re[5]: Порядок создания объектов
От: Bell Россия  
Дата: 02.11.04 10:34
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Bell, Вы писали:


B>>Все не так просто.

B>>Предположим, что имеется 2 потока, и эти 2 потока одновременно создают по экземрляру MyClass, соответственно в их конструкторах имеем одновременный вызов get_mutex, а это может окончится не очень хорошо...

V>Да, ты бы был прав, если бы не одно "но". У человека там конфликты возникают в момент инициализации модулей, т.е. в телах конструкторов статических объектов. Прежде, чем у тебя появиться возможность создать второй поток, этот мютекс (именно рассматриваемй случай), будет уже создан.


Вот поэтому в своем первом вопросе я и спросил — о глобальных объектах речь, или нет. Из текста вопроса совсем не очевидно, что речь о них.
Любите книгу — источник знаний (с) М.Горький
Re: Порядок создания объектов
От: Аноним  
Дата: 02.11.04 12:38
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Есть такой текст:


А>Как мне добиться, чтобы во время создания объекта класса MyClass

А>(вообще говоря, в другом модуле) объект mutex уже был создан?

У Александреску эта тема довольно подробно рассмотрена (глава про синглтоны).
Re[2]: Порядок создания объектов
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 03.11.04 13:41
Оценка: +1
Здравствуйте, 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 потока.
Re[2]: Порядок создания объектов
От: alnsn Великобритания http://nasonov.blogspot.com
Дата: 03.11.04 13:43
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Есть такой текст:


А>>Как мне добиться, чтобы во время создания объекта класса MyClass

А>>(вообще говоря, в другом модуле) объект mutex уже был создан?

А>У Александреску эта тема довольно подробно рассмотрена (глава про синглтоны).


И это надо обязательно прочитать:
Scott Meyers & Alexandrescu
C++ and the Perils of Double-Checked Locking
http://www.aristeia.com/Papers/DDJ_Jul_Aug_2004_revised.pdf
Re[3]: Порядок создания объектов
От: vdimas Россия  
Дата: 03.11.04 17:30
Оценка:
Здравствуйте, alnsn, Вы писали:

A>Насколько я помню, вызов конструктора статической переменной может отложиться до первого вызова любой функции,

A>определенной в том же TU. Это может произойти после вызова main, когда у тебя уже >1 потока.

а речь идет о статической переменной, или глобальной?
Re[5]: Порядок создания объектов
От: AlexanderDz  
Дата: 04.11.04 08:10
Оценка:
Здравствуйте, vdimas, Вы писали:

V>Здравствуйте, Bell, Вы писали:


B>>Все не так просто.

B>>Предположим, что имеется 2 потока, и эти 2 потока одновременно создают по экземрляру MyClass, соответственно в их конструкторах имеем одновременный вызов get_mutex, а это может окончится не очень хорошо...

V>Да, ты бы был прав, если бы не одно "но". У человека там конфликты возникают в момент инициализации модулей, т.е. в телах конструкторов статических объектов. Прежде, чем у тебя появиться возможность создать второй поток, этот мютекс (именно рассматриваемй случай), будет уже создан.


А что если статические объекты в конструкторе создают потоки?

Александр
Re[4]: Порядок создания объектов
От: MaximE Великобритания  
Дата: 04.11.04 08:24
Оценка:
vdimas wrote:

> Здравствуйте, alnsn, Вы писали:

>
> A>Насколько я помню, вызов конструктора статической переменной может отложиться до первого вызова любой функции,
> A>определенной в том же TU. Это может произойти после вызова main, когда у тебя уже >1 потока.
>
> а речь идет о статической переменной, или глобальной?

Здесь это не так важно.

function static — хороший способ создания проблем в многопотоковом коде. Сегодня у тебя этот static инициализирует один поток, завтра — ?, и компилятор здесь тебе не поможет никакой диагностикой.

--
Maxim Yegorushkin
Posted via RSDN NNTP Server 1.9 gamma
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.