| Re: thread safe singlton - возможно ли такое в принципе | |
| От: | WolfHound rsdn | ||
| Дата: | 06.02.04 12:50 | ||
| Оценка: | 16 (2) | ||
| Здравствуйте, Andrew S, Вы писали: Толком не тестировал но по идеи так
... << RSDN@Home 1.1.3 beta 1 >> Пусть это будет просто: просто, как только можно, но не проще. (C) А. Эйнштейн |
| Re[9]: thread safe singlton - возможно ли такое в принципе | |
| От: | Павел Кузнецов модератор | ||
| Дата: | 22.06.04 15:38 | ||
| Оценка: | 10 (2) | ||
> > > Из этого куска следует, что lock для семейства P6 наконец-то начинает работать как memory barrier Да, именно это я и имел в виду. > но как быть с P5 и 486-386? Эти процессоры не переупорядочивают запись, так что им memory barrier не нужен, достаточно атомарности изменений. Posted via RSDN NNTP Server 1.9 beta Discussion is an exchange of knowledge; an argument is an exchange of ignorance. Discussion is an expression of logic; an argument is an expression of temper. Discussion tries to prove what is right; an argument tries to prove who is right. |
| Re[4]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 06.02.04 14:21 | ||
| Оценка: | +1 | ||
| AS>>2. Медленно. V>А если вот так? V>
И так медленно 1. static volatile bool 2. объвлять его членом класса. 3. Не скомпилируется — obj out of scope. 4. Создание объекта для надежности в отдельную статическую функцию (дабы не искушать оптимизатор). 5. Двойная проверка некорректно работает на некоторых SMP системах. Вообще ее не рекомендуют использовать — то там баг отловится, то там... В общем, работающее решение предложил WolfHound, но мне оно по ряду причин не нравится и рекомендовать его к использованию я не могу. Но оно рабочее и даже в некотором смысле кошерное. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[10]: thread safe singlton - возможно ли такое в принципе | |
| От: | Павел Кузнецов модератор | ||
| Дата: | 22.06.04 17:55 | ||
| Оценка: | +1 | ||
| >>> чтение тоже может быть переупорядочено. <...> Чтобы проблемы не было надо ставить acquire lock после atom_get, а InterlockedExchangeAdd, через который реализован atom_get этого не делает. > > ПК>Если я правильно понял MSDN, то должен делать там, где это нужно... > > http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/interlockedexchange64.asp > Вроде ни слова про барьеры. Внизу странички ссылка: http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/synchronization_and_multiprocessor_issues.asp Это и есть неформальное описание memory barrier. Posted via RSDN NNTP Server 1.9 beta Discussion is an exchange of knowledge; an argument is an exchange of ignorance. Discussion is an expression of logic; an argument is an expression of temper. Discussion tries to prove what is right; an argument tries to prove who is right. |
| Re[6]: Вопрос. | |
| От: | Andrew S | ||
| Дата: | 09.07.04 09:14 | ||
| Оценка: | +1 | ||
| _>>Спросил только для того что бы получше понять смысл написанного. Человек я простой, только простые вещи понимаю. Насколько я понимаю, все будет работать даже так: WH>хъ _>>Правильно? WH>А вот тут нет memory barrier(он встроен в InterlockedXXX функции). Так что теоритически могут быть проблемы. Почему нет?
Имхо, просто этот код тормознее, поскольку возможны конфликты, и, соотв, попадание в sleep при одновременном входе из разных потоков... Двойная проверка как раз делается для того, чтобы быстрее было. А выше был приведен классический "медленный" вариант. Любоай auto_lock, предоставляемый средствами OS, должен являться memmory barrier. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[17]: thread safe singlton - возможно ли такое в принципе | |
| От: | Lexey rsdn | ||
| Дата: | 19.07.04 19:05 | ||
| Оценка: | +1 | ||
| Здравствуйте, Andrew S, Вы писали: L>>Это как раз совершенно не серьезное преимущество. L>>В общем, я могу предложить вариант, который наверное устроит и тебя и меня. L>>Сделать синглетон-критическую секцию, создание которой защитить lightweight_mutex'ом (создание тут быстрое, так что можно). И вот эту критическую секцию и использовать при инициализации остальных синглетонов. AS>Одну критическую секция на все? Несерьезно, тормоза будут дикие, более того может Совсем не обязательно. Можно, например, сделать шаблонную "фабрику" критических секций. AS> быть так, что создание одного синглтона зависит от другого, и это происходит в разных потоках. Придется все-равно по одному именованному объекту на синглтон. Мне кажется, это не очень хорошая мысль. А точнее, очень _не_ хорошая. Впрочем, каждому А где ты в критической секции увидел именованные объекты? AS> свое AS>В любом случае, серебряной пули не существует... Это верно. ... << RSDN@Home 1.1.4 beta 1 >> How is it going to end? |
| thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 06.02.04 12:07 |
| Всем доброго времени суток. Итак, как было выяснено здесь Автор: Andrew S , синглтон Майерса не является потокобезопасным.Дата: 06.02.04
Первое, что я подумал — сделать синглтон на хипе, создание защитить критическими секциями. Однако, критические секции (ну или мутексы, какая разница...) перед использованием надо инициализировать. Но, поскольку для синхронизации нам надо уже иметь проинициализированной критическую секкцию, опять приходим к идиоме синглтона майерса (уже для инициализации критической секции) со всем вытекающими проблемами потоконебезопасности. Какие варианты подскажет уважаемая общественность? http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re: thread safe singlton - возможно ли такое в принципе | |
| От: | ArtDenis | ||
| Дата: | 06.02.04 12:20 |
| Здравствуйте, Andrew S, Вы писали: AS>Итак, как было выяснено здесь Автор: Andrew S , синглтон Майерса не является потокобезопасным.Дата: 06.02.04 У Александреску есть хороший потокобезопасный синглтон. ... << RSDN@Home 1.1.2 stable >> www.jimm.org — бесплатная аська для сотовых |
| Re: thread safe singlton - возможно ли такое в принципе | |
| От: | Вадим Никулин | ||
| Дата: | 06.02.04 12:42 |
| Здравствуйте, Andrew S, Вы писали: AS>Всем доброго времени суток. AS>Итак, как было выяснено здесь Автор: Andrew S , синглтон Майерса не является потокобезопасным.Дата: 06.02.04 AS>
AS>Какие варианты подскажет уважаемая общественность? Не совсем понятно, почему студия должна генерить потоко-независимый код. Если бы она это делала, то какая была бы эффективность этого кода? Об этом должен заботиться разработчик. |
| Re[2]: thread safe singlton - возможно ли такое в принципе | |
| От: | Вадим Никулин | ||
| Дата: | 06.02.04 12:49 |
| Здравствуйте, Вадим Никулин, Вы писали: ВН>Здравствуйте, Andrew S, Вы писали: AS>>Всем доброго времени суток. AS>>Итак, как было выяснено здесь Автор: Andrew S , синглтон Майерса не является потокобезопасным.Дата: 06.02.04 AS>>
AS>>Какие варианты подскажет уважаемая общественность? ВН>Не совсем понятно, почему студия должна генерить потоко-независимый код. Если бы она это делала, то какая была бы эффективность этого кода? Об этом должен заботиться разработчик. Да, забыл сказать, мьютекс можно создать без проблем, т. к. если два потока одновременно попытаются создать мьютексы с одинаковым именем, один из них получит отказ, и должен будет проверить, а не создан ли мьютекс пока он его создавал. Если да, то его просто нужно открыть. |
| Re[2]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 06.02.04 12:54 |
| AS>>Итак, как было выяснено здесь Автор: Andrew S , синглтон Майерса не является потокобезопасным.Дата: 06.02.04 AD>У Александреску есть хороший потокобезопасный синглтон. Нет у него _работающего_ потокобезопасного синглетона, к сожалению. То, что есть — основывается на том, что критическая секция инициализируется в конструкторе синглетона. А тот, в свою очередь, статически создается в cpp файле. Тогда уже можно и целевой объект статически создавать в cpp файле, напарываясь при этом на неопределенность инициализации статических объектов в разных модулях. За что боролись, на то и напоролись. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[3]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 06.02.04 12:57 |
| ВН>>Не совсем понятно, почему студия должна генерить потоко-независимый код. Если бы она это делала, то какая была бы эффективность этого кода? Об этом должен заботиться разработчик. Ну, этот код вызывается один раз при первом вызове функции — эффективность не сильно пострадала бы. А вот нервы разработчика — точно были бы целее. ВН>Да, забыл сказать, мьютекс можно создать без проблем, т. к. если два потока одновременно попытаются создать мьютексы с одинаковым именем, один из них получит отказ, и должен будет проверить, а не создан ли мьютекс пока он его создавал. Если да, то его просто нужно открыть. Верно, но это только для именованых мьютексов. Представляете, какая производительность такого кода будет? http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[2]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 06.02.04 13:05 |
Честно говоря, я так и думал, что будут советовать нечто в этом роде Я сам рассматривал возможность синхронизации через семейство Interlockedxxx функций, но, согласитесь, выглядит это по меньшей мере страшненько (на самом деле я бы такой код в проекте не допустил, уж лучше инициализировать синглетон статически в файле реализации и потерять безопасность на этапе конструирования статических объектов — т.е. гарантировать, что на этом этапе вызова Instance не будет. Это проще и безопаснее, чем написать такое решение...). Но за попытку спасибо! http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[3]: thread safe singlton - возможно ли такое в принципе | |
| От: | WolfHound rsdn | ||
| Дата: | 06.02.04 13:15 |
| Здравствуйте, Andrew S, Вы писали: AS>Я сам рассматривал возможность синхронизации через семейство Interlockedxxx функций, но, согласитесь, выглядит это по меньшей мере страшненько (на самом деле я бы такой код в проекте не допустил, уж лучше инициализировать синглетон статически в файле реализации и потерять безопасность на этапе конструирования статических объектов — т.е. гарантировать, что на этом этапе вызова Instance не будет. Это проще и безопаснее, чем написать такое решение...). Но за попытку спасибо! Чем лучше? Я эту идею из boost позаимствовал... ... << RSDN@Home 1.1.3 beta 1 >> Пусть это будет просто: просто, как только можно, но не проще. (C) А. Эйнштейн |
| Re: thread safe singlton - возможно ли такое в принципе | |
| От: | Павел Кузнецов модератор | ||
| Дата: | 06.02.04 13:23 |
| Здравствуйте, Andrew, Вы писали: AS> Первое, что я подумал — сделать синглтон на хипе, создание AS> защитить критическими секциями. Не обязательно создавать объект singleton в динамической памяти. Достаточно предварить определение статического объекта захватом мьютекса или критической секции. AS> Однако, критические секции (ну или мутексы, какая разница...) перед AS> использованием надо инициализировать. Один из вариантов — инициализировать критическую секцию/мьютекс заведомо до использования singleton. Если структура программы настолько аморфна, что ничего о времени использования тех или иных объектов сказать нельзя, возможно, стоит задуматься об архитектуре. Posted via RSDN NNTP Server 1.7 "Bedlam" Discussion is an exchange of knowledge; an argument is an exchange of ignorance. Discussion is an expression of logic; an argument is an expression of temper. Discussion tries to prove what is right; an argument tries to prove who is right. |
| Re[4]: thread safe singlton - возможно ли такое в принципе | |
| От: | unrealalex | ||
| Дата: | 06.02.04 13:25 |
| WH>Я эту идею из boost позаимствовал... если мне память не изменяет, то из lightweight_mutex... только я бы Sleep(0) оставил — так квант отдаеться, а в твоем случае задержка, хоть и маленькая. Невозможное мы сделаем сегодня — чудо займет немного больше времени. /Аноним/ |
| Re[2]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 06.02.04 13:27 |
| ПК>Один из вариантов — инициализировать критическую секцию/мьютекс заведомо до ПК>использования singleton. Верно. Например, в файле реализации синглетона, как это сделано у Александреску. Но тогда возможна ситуация вызова Instance с еще непроинициализированной критической секцией. В общем, за что боролись... Печально, Павел, неужели нет красивого выхода из этой ситауции? ПК>Если структура программы настолько аморфна, что ничего о времени использования ПК>тех или иных объектов сказать нельзя, возможно, стоит задуматься об архитектуре. Нет, меня вполне устраивает объявление объекта синглтона в файле реализации и я могу гарантировать, что Instance будет вызываться только после инициализации статических объектов. Но меня интересует не конкретный проект, а именно принцип. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[4]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 06.02.04 13:30 |
| AS>>Я сам рассматривал возможность синхронизации через семейство Interlockedxxx функций, но, согласитесь, выглядит это по меньшей мере страшненько (на самом деле я бы такой код в проекте не допустил, уж лучше инициализировать синглетон статически в файле реализации и потерять безопасность на этапе конструирования статических объектов — т.е. гарантировать, что на этом этапе вызова Instance не будет. Это проще и безопаснее, чем написать такое решение...). Но за попытку спасибо! WH>Чем лучше? Я эту идею из boost позаимствовал... Ну, мы люди темные, бустом не пользуемся Как говорил Туполев — некрасивый самолет не полетит. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[5]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 06.02.04 13:31 |
| WH>>Я эту идею из boost позаимствовал... U>если мне память не изменяет, то из lightweight_mutex... только я бы Sleep(0) оставил — так квант отдаеться, а в твоем случае задержка, хоть и маленькая. Нет, это ошибка в MSDN. Квант то отдается, а вот загрузка процесса — становится максимальной. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re: thread safe singlton - возможно ли такое в принципе | |
| От: | Vamp | ||
| Дата: | 06.02.04 13:38 |
| Наверное, я чего-то не понимаю. А почему нельзя просто AS>
Виндоус-компилятора нет, проверить не могу — но любопытно. Да здравствует мыло душистое и веревка пушистая. |
| Re[3]: thread safe singlton - возможно ли такое в принципе | |
| От: | Павел Кузнецов модератор | ||
| Дата: | 06.02.04 13:39 |
| Здравствуйте, Andrew, Вы писали: AS> Нет, меня вполне устраивает объявление объекта синглтона в AS> файле реализации и я могу гарантировать, что Instance AS> будет вызываться только после инициализации статических объектов. AS> Но меня интересует не конкретный проект, а именно принцип. Боюсь, что более-менее общим принципом будет как раз архитектура, позволяющая отделить инициализацию вспомогательных ресурсов (в данном случае критическая секция) от инициализации и использования основных объектов (синглтон)... Думаю, что "локального" платформенно-независимого решения, прозрачного для использующей программы, нет. Posted via RSDN NNTP Server 1.7 "Bedlam" Discussion is an exchange of knowledge; an argument is an exchange of ignorance. Discussion is an expression of logic; an argument is an expression of temper. Discussion tries to prove what is right; an argument tries to prove who is right. |
| Re[2]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 06.02.04 13:48 |
AS>>
V>Виндоус-компилятора нет, проверить не могу — но любопытно. Мысль правильная, реализация — нет. 1. Хэндл не присваивается и не закрывается 2. Медленно. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[3]: thread safe singlton - возможно ли такое в принципе | |
| От: | Vamp | ||
| Дата: | 06.02.04 13:56 |
| AS>Мысль правильная, реализация — нет. AS>1. Хэндл не присваивается и не закрывается Ну, это понятно. Замнем для ясности. AS>2. Медленно. А если вот так?
Да здравствует мыло душистое и веревка пушистая. |
| Re[2]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 06.02.04 15:08 |
| Кстати, вот этот код абсолютно бесполезен: WH>
Просто читая volatile переменную типа int или long на win32 мы гарантированно получаем валидное значение (старое или новое — вопрос другой, но валидное). Т.о. приведенный код ровным счетом ничего не делает. Так утверждают и господин Рихтер, да и многие другие, и я склонен с ними соглашаться. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[5]: thread safe singlton - возможно ли такое в принципе | |
| От: | Vamp | ||
| Дата: | 06.02.04 15:13 |
Попытка номер 3
AS>И так медленно AS>2. объвлять его членом класса. Зачем? AS>4. Создание объекта для надежности в отдельную статическую функцию (дабы не искушать оптимизатор). Нечего ему тут оптимизровать. Да здравствует мыло душистое и веревка пушистая. |
| Re: thread safe singlton - возможно ли такое в принципе | |
| От: | PM | ||
| Дата: | 09.02.04 07:39 |
| Здраствуйте, Andrew S. Вы писали: AS> Всем доброго времени суток. AS> Итак, как было выяснено AS> здесь[/url AS> ], синглтон Майерса не является потокобезопасным. [] Д. Шмидт рассматривал это в паттерне [url=http://www.cs.wustl.edu/~schmidt/PDF/DC-Locking.pdf]Double-Checked Locking Автор: Andrew S Дата: 06.02.04 Posted via RSDN NNTP Server 1.7 "Bedlam" |
| Re: Мой вариант. Работает ли это в принципе? | |
| От: | Аноним 95 | ||
| Дата: | 21.06.04 07:02 |
Самому понадобилось: попробовал сделать сам.
|
| Re[2]: Мой вариант. Работает ли это в принципе? | |
| От: | kmn | ||
| Дата: | 21.06.04 07:32 |
| Здравствуйте, Аноним, Вы писали: А>Самому понадобилось: попробовал сделать сам. А>[ccode] А>template <class T> А>class CSingleton А>{ А> static T* pInstance; А> static CCriticalSection cs; А>protected: А> CSingleton(); А> CSingleton(const CSingleton&); А> CSingleton& operator=(const CSingleton&); А> virtual ~CSingleton(){pInstance = NULL;} А>public: А> static T* Instance(void); А> void Free(void); А>} Не дороговато ли хранить для каждого сингелтона свой объект синхронизации? |
| Re[2]: Мой вариант. Работает ли это в принципе? | |
| От: | Павел Кузнецов модератор | ||
| Дата: | 21.06.04 14:39 |
>
Это так называемый Double Checked Locking. В общем случае, без использования специфических для платформы средств для организации memory barrier, не работает. Немного подробнее: http://rsdn.ru/Forum/Message.aspx?mid=380025&only=1 Автор: Павел Кузнецов Дата: 10.09.03 Posted via RSDN NNTP Server 1.9 beta Discussion is an exchange of knowledge; an argument is an exchange of ignorance. Discussion is an expression of logic; an argument is an expression of temper. Discussion tries to prove what is right; an argument tries to prove who is right. |
| Re[3]: Мой вариант. Работает ли это в принципе? | |
| От: | Блудов Павел rsdn | ||
| Дата: | 22.06.04 02:28 |
| Здравствуйте, kmn, Вы писали: kmn>Не дороговато ли хранить для каждого сингелтона свой объект синхронизации? Нет. Если singleton "легче" чем Critical Section — для него нет смысла делать отложенную инициализацию. ... << Rsdn@Home 1.1.4 beta 1 >> |
| Re[3]: Мой вариант. Работает ли это в принципе? | |
| От: | Аноним 95 | ||
| Дата: | 22.06.04 06:14 |
| Здравствуйте, Павел Кузнецов, Вы писали: ПК>Это так называемый Double Checked Locking. В общем случае, без использования специфических для платформы средств для организации memory barrier, не работает. Немного подробнее: http://rsdn.ru/Forum/Message.aspx?mid=380025&only=1 Автор: Павел Кузнецов Дата: 10.09.03 Как я понял из этой статьи надо сделать как-то так:
|
| Re[4]: Мой вариант. Работает ли это в принципе? | |
| От: | WolfHound модератор | ||
| Дата: | 22.06.04 08:39 |
| Здравствуйте, <Аноним>, Вы писали: ПК>>Это так называемый Double Checked Locking. В общем случае, без использования специфических для платформы средств для организации memory barrier, не работает. Немного подробнее: http://rsdn.ru/Forum/Message.aspx?mid=380025&only=1 Автор: Павел Кузнецов Дата: 10.09.03 Вот Double Checked Locking с memory barrier Re: thread safe singlton — возможно ли такое в принципе Автор: WolfHound Дата: 06.02.04 Велосипед уже изобретен. ... << RSDN@Home 1.1.3 beta 1 >> Пусть это будет просто: просто, как только можно, но не проще. (C) А. Эйнштейн |
| Re[2]: thread safe singlton - возможно ли такое в принципе | |
| От: | bw | ||
| Дата: | 22.06.04 09:57 |
| Здравствуйте, WolfHound, Вы писали: WH>Здравствуйте, Andrew S, Вы писали: WH>Толком не тестировал но по идеи так <nice code skepped> Это же DCLP. Не на всех платформах будет работать. Хотя на IA-32 проблем конечно нет. |
| Re[3]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 22.06.04 10:07 |
| bw>Это же DCLP. Не на всех платформах будет работать. Хотя на IA-32 проблем конечно нет. Это не так. Обратите внимание на atom_get\atom_set http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[5]: Мой вариант. Работает ли это в принципе? | |
| От: | Yacha | ||
| Дата: | 22.06.04 10:17 |
| Здравствуйте, WolfHound, Вы писали: WH>Здравствуйте, <Аноним>, Вы писали: ПК>>>Это так называемый Double Checked Locking. В общем случае, без использования специфических для платформы средств для организации memory barrier, не работает. Немного подробнее: http://rsdn.ru/Forum/Message.aspx?mid=380025&only=1 Автор: Павел Кузнецов Дата: 10.09.03 WH>Вот Double Checked Locking с memory barrier WH>Re: thread safe singlton — возможно ли такое в принципе Автор: WolfHound Дата: 06.02.04 WH>Велосипед уже изобретен. А можно немножко прокоментировать код, на предмет, как здесь реализованы memory barrier-ы. В статье Скота Меерса, говорится о двух типах барьеров(aquire/release). http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf |
| Re[4]: thread safe singlton - возможно ли такое в принципе | |
| От: | bw | ||
| Дата: | 22.06.04 10:22 |
| Здравствуйте, Andrew S, Вы писали: bw>>Это же DCLP. Не на всех платформах будет работать. Хотя на IA-32 проблем конечно нет. AS>Это не так. Обратите внимание на atom_get\atom_set Видел. Их обоснованность вызвает у меня большие сомнения. Interlocked функции гарантируют атомарность конкретной операции над памятью, но не имеют никакого отношения к переупорядочиванию доступа к памяти. Именно в этом проблема DCLP. Например, мы можем получить в obj_ptr адрес недоконстурированного объекта. static T obj; //write 1: obj = <initialization value> ptr=&obj; atom_set((LONG*)&obj_ptr, (LONG)ptr); //write 2: obj_ptr = obj Эти операции записи могут быть переупорядочены и другой процессор увидит ненулевое значение в obj_ptr еще до того, как произойдет инициализация obj. |
| Re[5]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 22.06.04 11:06 |
| bw>Видел. Их обоснованность вызвает у меня большие сомнения. bw>Interlocked функции гарантируют атомарность конкретной операции над памятью, но не имеют никакого отношения к переупорядочиванию доступа к памяти. Именно в этом проблема DCLP. Например, мы можем получить в obj_ptr адрес недоконстурированного объекта. bw>static T obj; //write 1: obj = <initialization value> bw>ptr=&obj; bw>atom_set((LONG*)&obj_ptr, (LONG)ptr); //write 2: obj_ptr = obj bw>Эти операции записи могут быть переупорядочены и другой процессор увидит ненулевое значение в obj_ptr еще до того, как произойдет инициализация obj. На мой взгляд — это уже проблема самого объекта и компилятора. Если предполагается, что он будет использоваться таким образом (т.е. в MP среде), то вполне очевидно, что компилятор должен обеспечить валидность объекта (т.е. его полное конструирование) до первого обращения к объекту (либо взятия его адреса\ссылки). Иначе любая, даже однопоточная программа, будет постоянно иметь дело с необходимостью "ручной" синхронизации кешей процессоров. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[6]: thread safe singlton - возможно ли такое в принципе | |
| От: | bw | ||
| Дата: | 22.06.04 11:56 |
| Здравствуйте, Andrew S, Вы писали: bw>>static T obj; //write 1: obj = <initialization value> bw>>ptr=&obj; bw>>atom_set((LONG*)&obj_ptr, (LONG)ptr); //write 2: obj_ptr = obj bw>>Эти операции записи могут быть переупорядочены и другой процессор увидит ненулевое значение в obj_ptr еще до того, как произойдет инициализация obj. AS>На мой взгляд — это уже проблема самого объекта и компилятора. Если предполагается, что он будет использоваться таким образом (т.е. в MP среде), то вполне очевидно, что компилятор должен обеспечить валидность объекта (т.е. его полное конструирование) до первого обращения к объекту (либо взятия его адреса\ссылки). Иначе любая, даже однопоточная программа, будет постоянно иметь дело с необходимостью "ручной" синхронизации кешей процессоров. Инициализация объекта для процессора по сути такая же операция записи, как и масса других. Если компилятор между всеми операциями записи будет вставлять барьер, то производительность загнется. Я думаю, тебя сбил с тольку термин "переупорядочивиание". Поясню: на одном процессоре мы выполняем приведенный выше код. Если этот процессор призведет write reoder, то другой процессор, выполняющий другой поток нашего процесса, может увидеть сначала результат второй операции, а потом результат первой. А вот наш первый процессор всегда будет видеть операции записи в правильном порядке, для него видимое поведение не изменится, будет ли write reoder или нет. PS. И насчет синхронизации кешей — это никогда не является проблемой программиста — это забота проектировщика железа. Как правильно заметили в параллельной ветке — "будь там хоть три кеша". Можно конечно для упрощения понимать проблему переупорядочивания, как проблему синхронизации кешей, но самом деле это не так. PPS. Насчtт DCLP можно почитать вот это http://www.nwcpp.org/Downloads/2004/DCLP_notes.pdf Только не дай Мейерсу ввести себя в заблуждения синхронизацией кешей |
| Re: thread safe singlton - возможно ли такое в принципе | |
| От: | VVB16 | ||
| Дата: | 22.06.04 12:09 |
| Здравствуйте, Andrew S, Вы писали: Часть реализации из ACE (по комментариям понятно, что используется):
Причем Lock тут может быть любой — thread_mutex (CriticalSection в Win) и т.п. Подробнее — в самом ACE. -- Vitaly Belekhov |
| Re[6]: thread safe singlton - возможно ли такое в принципе | |
| От: | Павел Кузнецов модератор | ||
| Дата: | 22.06.04 12:43 |
| > bw>Interlocked функции гарантируют атомарность конкретной операции над памятью, но не имеют никакого отношения к переупорядочиванию доступа к памяти. В соответствии с MSDN эти функции включают memory barrier на тех системах, где это нужно. > Именно в этом проблема DCLP. Например, мы можем получить в obj_ptr адрес недоконстурированного объекта. > > bw>static T obj; //write 1: obj = <initialization value> > bw>ptr=&obj; > bw>atom_set((LONG*)&obj_ptr, (LONG)ptr); //write 2: obj_ptr = obj > > bw>Эти операции записи могут быть переупорядочены и другой процессор увидит ненулевое значение в obj_ptr еще до того, как произойдет инициализация obj. > > На мой взгляд — это уже проблема самого объекта и компилятора. Если предполагается, что он будет использоваться таким образом (т.е. в MP среде), то вполне очевидно, что компилятор должен обеспечить валидность объекта (т.е. его полное конструирование) до первого обращения к объекту (либо взятия его адреса\ссылки). Вовсе нет: компилятор вполне может требовать внешней синхронизации при доступе из разных потоков. > Иначе любая, даже однопоточная программа, будет постоянно иметь дело с необходимостью "ручной" синхронизации кешей процессоров. Это не так: если запись переупорядочивает компилятор, то однопоточная программа будет получать значения не из памяти, а из регистров. Если же запись переупорядочивает процессор, то поток, выполняющийся на данном процессоре, будет получать значения из его кэша. Проблемы начнутся только при доступе к объекту из другого потока без внешней синхронизации. Т.к. в данном случае memory barrier присутствует (в виде Interlocked*), все должно быть в порядке. Posted via RSDN NNTP Server 1.9 beta Discussion is an exchange of knowledge; an argument is an exchange of ignorance. Discussion is an expression of logic; an argument is an expression of temper. Discussion tries to prove what is right; an argument tries to prove who is right. |
| Re[7]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 22.06.04 13:56 |
| ПК>Это не так: если запись переупорядочивает компилятор, то однопоточная программа будет получать значения не из памяти, а из регистров. Если же запись переупорядочивает процессор, то поток, выполняющийся на данном процессоре, будет получать значения из его кэша. Проблемы начнутся только при доступе к объекту из другого потока без внешней синхронизации. ПК>Т.к. в данном случае memory barrier присутствует (в виде Interlocked*), все должно быть в порядке. Да, но он присутствует относительное не самого объекта, а указателя на него. Если atom_get\atom_set гарантируют, что процессоры будут синхронизированы относительно общего состояния (т.е. синхронизация очередей команд, кеша и прочее) — тогда конечно. (насколько я помню, interlocked это гарантирует только для собственно указателя, точнее, для той области памяти, что представляет значение указателя. На самом деле он гарантирует, что, изменяя значение, мы корректно его изменим + получим обратно то, что было. Кстати, реализация atom_get ака WolfHound абсолюно бессмысленна — подробнее в Рихтере). Т.о. ситуация, описанная WB (т.е. когда мы осуществили атомарно изменение указателя, но не уведомили другие процессоры об инициализации T) вполне возможна. Вот из описания команды\сигнала lock
http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[8]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 22.06.04 14:32 |
| AS>Вот из описания команды\сигнала lock AS>
Хотя, с другой стороны, из манула IA32:
Из этого куска следует, что lock для семейства P6 наконец-то начинает работать как memory barrier (и в этом случае atom_get ака WolfHound будет работать). Великолепно, но как быть с P5 и 486-386? http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[7]: thread safe singlton - возможно ли такое в принципе | |
| От: | bw | ||
| Дата: | 22.06.04 16:11 |
| Здравствуйте, Павел Кузнецов, Вы писали: >> bw>Interlocked функции гарантируют атомарность конкретной операции над памятью, но не имеют никакого отношения к переупорядочиванию доступа к памяти. ПК>В соответствии с MSDN эти функции включают memory barrier на тех системах, где это нужно. <skipped> ПК>Т.к. в данном случае memory barrier присутствует (в виде Interlocked*), все должно быть в порядке. Действительно, InterlockedExchange генерирует нужный mb — мой MSDN оказался староват Зачем это понадобилось MS не знаю. Наверное, чтобы старый плохой код продолжал работать... Однако, даже если отвлечься от того, что решение получилось WIN API-specific, хотя автор наверняка имел в виду общее решение, то и в этом случае решение нерабочее. Неправильно в нем то, что чтение тоже может быть переупорядочено.
В точке read_1 мы читаем значение указателя, в точке read_2 мы читаем данные по этому указателю. Эти две операции могут быть переупорядочены. Может возникнуть вопрос, как такое может случиться, если мы сначала читаем указатель, по которому затем уже читаем данные — может. Если каким-то образом предшествующий использованию синглтона some_call() произвел чтение read_0 из будущего адреса obj_ptr. На IA-64 такое невозможно — там есть соответствующий data-dependency restriction. На альфе возможно: http://www.cs.umd.edu/~pugh/java/memoryModel/AlphaReordering.html На SparcV9 кажется тоже возможно. Буду благодарен, если кто-нибудь сможет это подтвердить или опровергнуть. Чтобы проблемы не было надо ставить acquire lock после atom_get, а InterlockedExchangeAdd, через который реализован atom_get этого не делает. |
| Re[10]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 22.06.04 16:15 |
| >> но как быть с P5 и 486-386? ПК>Эти процессоры не переупорядочивают запись, так что им memory barrier не нужен, достаточно атомарности изменений. Верно, как то об этом не подумал. Тогда все ок, хотя фраза о том, что майкрософт гарантирует, что InterlockedXxxx для НЕ IA32 архитектур является memory barrier, все-таки настораживает... http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[8]: thread safe singlton - возможно ли такое в принципе | |
| От: | Павел Кузнецов модератор | ||
| Дата: | 22.06.04 17:12 |
| > чтение тоже может быть переупорядочено. <...> Чтобы проблемы не было надо ставить acquire lock после atom_get, а InterlockedExchangeAdd, через который реализован atom_get этого не делает. Если я правильно понял MSDN, то должен делать там, где это нужно... Posted via RSDN NNTP Server 1.9 beta Discussion is an exchange of knowledge; an argument is an exchange of ignorance. Discussion is an expression of logic; an argument is an expression of temper. Discussion tries to prove what is right; an argument tries to prove who is right. |
| Re[4]: Мой вариант. Работает ли это в принципе? | |
| От: | Павел Кузнецов модератор | ||
| Дата: | 22.06.04 17:15 |
| > ПК>Это так называемый Double Checked Locking. В общем случае, без использования специфических для платформы средств для организации memory barrier, не работает. Немного подробнее: http://rsdn.ru/Forum/Message.aspx?mid=380025&only=1 Автор: Павел Кузнецов Дата: 10.09.03 > > Как я понял из этой статьи надо сделать как-то так: > >
Нет, этого недостаточно: перед чтением pinstance_ должен быть memory barrier, которого здесь нет. Posted via RSDN NNTP Server 1.9 beta Discussion is an exchange of knowledge; an argument is an exchange of ignorance. Discussion is an expression of logic; an argument is an expression of temper. Discussion tries to prove what is right; an argument tries to prove who is right. |
| Re[9]: thread safe singlton - возможно ли такое в принципе | |
| От: | bw | ||
| Дата: | 22.06.04 17:29 |
| Здравствуйте, Павел Кузнецов, Вы писали: >> чтение тоже может быть переупорядочено. <...> Чтобы проблемы не было надо ставить acquire lock после atom_get, а InterlockedExchangeAdd, через который реализован atom_get этого не делает. ПК>Если я правильно понял MSDN, то должен делать там, где это нужно... http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/interlockedexchange64.asp Вроде ни слова про барьеры. |
| Re[10]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 22.06.04 17:30 |
| ПК>>Если я правильно понял MSDN, то должен делать там, где это нужно... bw>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/interlockedexchange64.asp bw>Вроде ни слова про барьеры. А вы посмотрите код этих функций, и все станет понятно. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[3]: thread safe singlton - возможно ли такое в принципе | |
| От: | Шахтер | ||
| Дата: | 22.06.04 23:08 |
| Здравствуйте, Andrew S, Вы писали: ПК>>Один из вариантов — инициализировать критическую секцию/мьютекс заведомо до ПК>>использования singleton. AS>Верно. Например, в файле реализации синглетона, как это сделано у Александреску. AS>Но тогда возможна ситуация вызова Instance с еще непроинициализированной критической секцией. В общем, за что боролись... Печально, Павел, неужели нет красивого выхода из этой ситауции? ПК>>Если структура программы настолько аморфна, что ничего о времени использования ПК>>тех или иных объектов сказать нельзя, возможно, стоит задуматься об архитектуре. AS>Нет, меня вполне устраивает объявление объекта синглтона в файле реализации и я могу гарантировать, что Instance будет вызываться только после инициализации статических объектов. Но меня интересует не конкретный проект, а именно принцип. Не могу понять. Если вы можете гарантировать, что Instance вызывается после входа в main, то какие проблемы с инициализацией критической секции? Никаких. Если же у вас Instance вызывется до входа в main, то это значит, что нет отложенной инициализации и нет проблем с многопоточностью -- и синглетон вам не нужен тогда, а нужно решить проблему порядка конструирования статических объектов -- но это уже совсем другая проблема. ... << RSDN@Home 1.1.0 stable >>
|
| Re[3]: thread safe singlton - возможно ли такое в принципе | |
| От: | Шахтер | ||
| Дата: | 22.06.04 23:28 |
| Здравствуйте, Andrew S, Вы писали: ПК>>Один из вариантов — инициализировать критическую секцию/мьютекс заведомо до ПК>>использования singleton. AS>Верно. Например, в файле реализации синглетона, как это сделано у Александреску. AS>Но тогда возможна ситуация вызова Instance с еще непроинициализированной критической секцией. В общем, за что боролись... Печально, Павел, неужели нет красивого выхода из этой ситауции? Хотите хинт насчет критической секции? Есть критические секции с автоинициализацией. Т.е. для них не нужно вызывать конструктор -- достаточно статической инициализации членов структуры начальными значениями. ... << RSDN@Home 1.1.0 stable >>
|
| Re[4]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 23.06.04 06:22 |
| ПК>>>Один из вариантов — инициализировать критическую секцию/мьютекс заведомо до ПК>>>использования singleton. AS>>Верно. Например, в файле реализации синглетона, как это сделано у Александреску. AS>>Но тогда возможна ситуация вызова Instance с еще непроинициализированной критической секцией. В общем, за что боролись... Печально, Павел, неужели нет красивого выхода из этой ситауции? Ш>Хотите хинт насчет критической секции? Есть критические секции с автоинициализацией. Т.е. для них не нужно вызывать конструктор -- достаточно статической инициализации членов структуры начальными значениями. Какой конструктор? Вы про что? Я про win32 критические секции А вообще — теме уже 300 лет, проблема (точнее, вопрос) давно решена... http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[4]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 23.06.04 06:31 |
| ПК>>>Если структура программы настолько аморфна, что ничего о времени использования ПК>>>тех или иных объектов сказать нельзя, возможно, стоит задуматься об архитектуре. AS>>Нет, меня вполне устраивает объявление объекта синглтона в файле реализации и я могу гарантировать, что Instance будет вызываться только после инициализации статических объектов. Но меня интересует не конкретный проект, а именно принцип. Ш>Не могу понять. Если вы можете гарантировать, что Instance вызывается после входа в main, то какие проблемы с инициализацией критической секции? Никаких. Ш>Если же у вас Instance вызывется до входа в main, то это значит, что нет отложенной инициализации и нет проблем с многопоточностью -- и синглетон вам не нужен тогда, а нужно решить проблему порядка конструирования статических объектов -- но это уже совсем другая проблема. Вы не то выделяете AS>> Но меня интересует не конкретный проект, а именно принцип. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[11]: thread safe singlton - возможно ли такое в принципе | |
| От: | bw | ||
| Дата: | 23.06.04 13:41 |
| Здравствуйте, Andrew S, Вы писали: ПК>>>Если я правильно понял MSDN, то должен делать там, где это нужно... bw>>http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dllproc/base/interlockedexchange64.asp bw>>Вроде ни слова про барьеры. AS>А вы посмотрите код этих функций, и все станет понятно. Будет возможность — помотрю и напишу о результатах. Вполне возможно MS пошел на то,чтобы во всех Interlocked операциях добавить mb, хоть их и отговаривали http://groups.google.com/groups?hl=en&lr=&ie=UTF-8&frame=right&rnum=171&thl=1022546285,1023289076,1023286257,1023283857,1023276945,1023275247,1022994050,1022953118,1022946105,1022718570,1022701862,1022362731&seekm=3F78BD48.63529E65%40xemaps.com#link179 Своей критикой предложенного синглтона, я просто хотел подчеркнуть, что сами по себе atomic-операции, имеющиеся практически на любом процессоре, ничего не гарантируют. Вдруг кто захочет спортировать этот синглетон не под Win — чтобы знали подводные камни |
| Re: thread safe singlton - возможно ли такое в принципе | |
| От: | Дарней | ||
| Дата: | 02.07.04 03:17 |
| Здравствуйте, Andrew S, Вы писали: AS>Всем доброго времени суток. AS>Итак, как было выяснено здесь Автор: Andrew S , синглтон Майерса не является потокобезопасным.Дата: 06.02.04 честно говоря, я чего-то не понимаю. А почему этот синглтон должен был быть безопасным? Вроде бы никаких оснований для этого нет Всех излечит, исцелит добрый Ctrl+Alt+Delete |
| Re[2]: Вопрос. | |
| От: | sergey_shandar | ||
| Дата: | 08.07.04 02:38 |
| Здравствуйте, WolfHound, Вы писали: ... Можно ли этот код сократить до такого? WH>
Прежде всего, вопрос не о скорости, а о безопасности. |
| Re[3]: Вопрос. | |
| От: | WolfHound модератор | ||
| Дата: | 08.07.04 14:49 |
| Здравствуйте, sergey_shandar, Вы писали: _>Можно ли этот код сократить до такого? хъ _>Прежде всего, вопрос не о скорости, а о безопасности. Вроде можно. А нужно? ... << RSDN@Home 1.1.3 beta 1 >> Пусть это будет просто: просто, как только можно, но не проще. (C) А. Эйнштейн |
| Re[2]: thread safe singlton - возможно ли такое в принципе | |
| От: | Lexey rsdn | ||
| Дата: | 08.07.04 20:57 |
| Здравствуйте, WolfHound, Вы писали: WH>struct auto_lock WH>{ WH> auto_lock(LONG* ptr) WH> :ptr_(ptr) WH> { WH> while(atom_set(ptr_, 1)) WH> Sleep(1); WH> } Тут недавно в boost.develop появилась забавная нитка, в которой один перец довольно убедительно утверждает, что спин-локи, вообще говоря, довольно хреновая вещь, если у них нет fallback'а на синхронизационные примитивы ОС (там шла дискуссия по поводу boost::lightweight_mutex). ... << RSDN@Home 1.1.4 beta 1 >> How is it going to end? |
| Re[4]: Вопрос. | |
| От: | sergey_shandar | ||
| Дата: | 09.07.04 01:09 |
| Здравствуйте, WolfHound, Вы писали: _>>Прежде всего, вопрос не о скорости, а о безопасности. WH>Вроде можно. А нужно? Спросил только для того что бы получше понять смысл написанного. Человек я простой, только простые вещи понимаю. Насколько я понимаю, все будет работать даже так:
Правильно? |
| Re[5]: Вопрос. | |
| От: | WolfHound модератор | ||
| Дата: | 09.07.04 08:41 |
| Здравствуйте, sergey_shandar, Вы писали: _>Спросил только для того что бы получше понять смысл написанного. Человек я простой, только простые вещи понимаю. Насколько я понимаю, все будет работать даже так: хъ _>Правильно? А вот тут нет memory barrier(он встроен в InterlockedXXX функции). Так что теоритически могут быть проблемы. ... << RSDN@Home 1.1.3 beta 1 >> Пусть это будет просто: просто, как только можно, но не проще. (C) А. Эйнштейн |
| Re[3]: thread safe singlton - возможно ли такое в принципе | |
| От: | WolfHound модератор | ||
| Дата: | 09.07.04 08:41 |
| Здравствуйте, Lexey, Вы писали: L>Тут недавно в boost.develop появилась забавная нитка, в которой один перец довольно убедительно утверждает, что спин-локи, вообще говоря, довольно хреновая вещь, если у них нет fallback'а на синхронизационные примитивы ОС (там шла дискуссия по поводу boost::lightweight_mutex). А можно ее сюда процитировать? ... << RSDN@Home 1.1.3 beta 1 >> Пусть это будет просто: просто, как только можно, но не проще. (C) А. Эйнштейн |
| Re[4]: thread safe singlton - возможно ли такое в принципе | |
| От: | Lexey rsdn | ||
| Дата: | 09.07.04 20:54 |
| Здравствуйте, WolfHound, Вы писали: L>>Тут недавно в boost.develop появилась забавная нитка, в которой один перец довольно убедительно утверждает, что спин-локи, вообще говоря, довольно хреновая вещь, если у них нет fallback'а на синхронизационные примитивы ОС (там шла дискуссия по поводу boost::lightweight_mutex). WH>А можно ее сюда процитировать? Если только в понедельник. Дома я ее не читаю, а подписываться ради этого лень. ... << RSDN@Home 1.1.4 beta 1 >> How is it going to end? |
| Re[5]: thread safe singlton - возможно ли такое в принципе | |
| От: | Lexey rsdn | ||
| Дата: | 12.07.04 13:16 |
| Здравствуйте, Lexey, Вы писали: L>Здравствуйте, WolfHound, Вы писали: L>>>Тут недавно в boost.develop появилась забавная нитка, в которой один перец довольно убедительно утверждает, что спин-локи, вообще говоря, довольно хреновая вещь, если у них нет fallback'а на синхронизационные примитивы ОС (там шла дискуссия по поводу boost::lightweight_mutex). WH>>А можно ее сюда процитировать? L>Если только в понедельник. Дома я ее не читаю, а подписываться ради этого лень. Ну держись, сейчас буду постить.
и т.д. Как потом выяснилось, насчет 10 ms, он все-таки загнул. Но народ вроде сошелся на том, что критичексая секция все-таки получше будет. How is it going to end? |
| Re[6]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 12.07.04 14:01 |
| L>и т.д. Как потом выяснилось, насчет 10 ms, он все-таки загнул. Но народ вроде сошелся на том, что критичексая секция все-таки получше будет. Естественно, любой практически системный сервис, предоставляемый OS будет лучше (ну или _должен_ быть лучше). Но.. Каким образом Вы сможете использовать критическую секцию в приведенном синглетоне? Ее надо сначала проинициализировать — pkunzip.zip получается. Это во-первых. А во-вторых — производительность auto_lock нас не волнует, поскольку используется двойная проверка с memory barrier — т.о. в блок с auto_lock мы будем попадать только на этапе инициализации объекта синглтона, да и то скорее всего один раз. Единственная альтернатива (критические секции и неименованные мутексы не подойдут по приведенным выше соображениям) — это именованый мутекс. Но я сильно сомневаюсь, что поиск объекта по имени работает достаточно быстро (настолько быстро, чтобы быть существенно быстрее представленной реализации). В общем, в данном применении это наиболее оптимальный вариант lightweight мутекса, наверное. К тому же не засоряется пространство имен объектов. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[7]: thread safe singlton - возможно ли такое в принципе | |
| От: | Lexey rsdn | ||
| Дата: | 12.07.04 19:31 |
| Здравствуйте, Andrew S, Вы писали: L>>и т.д. Как потом выяснилось, насчет 10 ms, он все-таки загнул. Но народ вроде сошелся на том, что критичексая секция все-таки получше будет. AS>Естественно, любой практически системный сервис, предоставляемый OS будет лучше (ну или _должен_ быть лучше). Но.. AS>Каким образом Вы сможете использовать критическую секцию в приведенном синглетоне? Ее надо сначала проинициализировать — pkunzip.zip получается. Это AS> во-первых. А во-вторых — производительность auto_lock нас не волнует, поскольку используется двойная проверка с memory barrier — т.о. в блок с auto_lock мы будем попадать только на этапе инициализации объекта синглтона, да и то скорее всего один раз. Единственная альтернатива (критические секции и неименованные мутексы не подойдут по приведенным выше соображениям) — это именованый мутекс. Но я сильно сомневаюсь, что поиск объекта по имени работает достаточно быстро (настолько быстро, чтобы быть существенно быстрее представленной реализации). В общем, в данном применении это наиболее оптимальный вариант lightweight мутекса, наверное. К тому же не засоряется пространство имен объектов. В общем, я это и так знаю. ... << RSDN@Home 1.1.4 beta 1 >> How is it going to end? |
| Re[8]: thread safe singlton - возможно ли такое в принципе | |
| От: | WolfHound модератор | ||
| Дата: | 13.07.04 07:41 |
| Здравствуйте, Lexey, Вы писали: L>В общем, я это и так знаю. ... << RSDN@Home 1.1.3 beta 1 >> Пусть это будет просто: просто, как только можно, но не проще. (C) А. Эйнштейн |
| Re[9]: thread safe singlton - возможно ли такое в принципе | |
| От: | Lexey rsdn | ||
| Дата: | 13.07.04 20:21 |
| Здравствуйте, WolfHound, Вы писали: L>>В общем, я это и так знаю. WH> Хм, а в чем понт слипа на однопроцессорной машине? Я вот не могу себе представить, зачем он в этом случае может быть нужен. Если происходит context switch, а lock все еще не отпущен другим потоком, то какой смысл делать слип, если можно сразу делать kernel wait? По хорошему, на однопроцессорной машине спин-лок вообще не нужен (критическая секция, кстати, его и игнорирует на однопроцессорных машинах). ... << RSDN@Home 1.1.4 beta 1 >> How is it going to end? |
| Re[10]: thread safe singlton - возможно ли такое в принципе | |
| От: | WolfHound модератор | ||
| Дата: | 14.07.04 04:18 |
| Здравствуйте, Lexey, Вы писали: L>Хм, а в чем понт слипа на однопроцессорной машине? Я вот не могу себе представить, зачем он в этом случае может быть нужен. Если происходит context switch, а lock все еще не отпущен другим потоком, то какой смысл делать слип, если можно сразу делать kernel wait? По хорошему, на однопроцессорной машине спин-лок вообще не нужен (критическая секция, кстати, его и игнорирует на однопроцессорных машинах). Быть может я чего не понимаю но если будет так: поток 1 начал создавать объект и случилось переключение контекста поток 2 захотел получить доступ к объекту но объект все еще залочен в этом случае Sleep форсирует переключение контекста или я чего не понял? ... << RSDN@Home 1.1.3 beta 1 >> Пусть это будет просто: просто, как только можно, но не проще. (C) А. Эйнштейн |
| Re[11]: thread safe singlton - возможно ли такое в принципе | |
| От: | Lexey rsdn | ||
| Дата: | 14.07.04 19:03 |
| Здравствуйте, WolfHound, Вы писали: L>>Хм, а в чем понт слипа на однопроцессорной машине? Я вот не могу себе представить, зачем он в этом случае может быть нужен. Если происходит context switch, а lock все еще не отпущен другим потоком, то какой смысл делать слип, если можно сразу делать kernel wait? По хорошему, на однопроцессорной машине спин-лок вообще не нужен (критическая секция, кстати, его и игнорирует на однопроцессорных машинах). WH>Быть может я чего не понимаю но если будет так: WH>поток 1 начал создавать объект и случилось переключение контекста WH>поток 2 захотел получить доступ к объекту но объект все еще залочен в этом случае Sleep форсирует переключение контекста WH>или я чего не понял? Все так, только какой смысл тут делать sleep, если можно сразу в kernel wait уйти. ... << RSDN@Home 1.1.4 beta 1 >> How is it going to end? |
| Re[12]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 14.07.04 19:08 |
| L>Все так, только какой смысл тут делать sleep, если можно сразу в kernel wait уйти. Пример кода приведите, который в kernel wait уходит? Вам тут надо переключить конекст (т.е. усыпить тред до следующего shedule) — в виндовс это делается при помощи Sleep. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[13]: thread safe singlton - возможно ли такое в принципе | |
| От: | Lexey rsdn | ||
| Дата: | 15.07.04 19:42 |
| Здравствуйте, Andrew S, Вы писали: L>>Все так, только какой смысл тут делать sleep, если можно сразу в kernel wait уйти. AS>Пример кода приведите, который в kernel wait уходит? Создание именованного ивента + Wait на нем. AS>Вам тут надо переключить конекст (т.е. усыпить тред до следующего shedule) — в виндовс это делается при помощи Sleep. Wait как раз и вызовет переключение контекста. ... << RSDN@Home 1.1.4 beta 1 >> How is it going to end? |
| Re[14]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 15.07.04 21:16 |
| L>>>Все так, только какой смысл тут делать sleep, если можно сразу в kernel wait уйти. AS>>Пример кода приведите, который в kernel wait уходит? L>Создание именованного ивента + Wait на нем. Вообще то тут мы от этого пытаемся избавиться AS>>Вам тут надо переключить конекст (т.е. усыпить тред до следующего shedule) — в виндовс это делается при помощи Sleep. L>Wait как раз и вызовет переключение контекста. Sleep(1) тоже. А если слипа не будет — то тред, попавший в цикл по interlocked, не будет отдавать время и соотв, будет потреблять все процессорное время. Думаю, пользователям (да и инициализирующемуся в это время объекту синглтона) это не очень понравится И, еще раз — приведенный код (с auto_lock) будет вызываться от силы раз-два, и то при первом обращении к синглтону. Смысл создавать именованый kernel объект и засорять тем самым пространство имен? В общем, повторюсь, предложенный вариант будет вполне корректно работать на win32 (и, вероятно, с yield вместо sleep на linux — тут я не уверен, и прочитка топика, который привели вы, выяснила только одну проблему — что в линксовской используется счетчик (__atomic_add), а не просто обмен значениями, как в реализации, приведенной для win32 WolfHound'ом. Но это уже проблемы ДНК тех, кто писал эту реализацию, по моему глубокому убеждению. I love gnu libs code В общем — главный плюс этого кода не то, что он быстрее или медленнее нативных именованых объектов, предоставляемых ОС, а то, что он их собственно не требует, позволяя не засорять пространство имен на одноразовое фактически использование. http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[15]: thread safe singlton - возможно ли такое в принципе | |
| От: | Lexey rsdn | ||
| Дата: | 17.07.04 17:28 |
| Здравствуйте, Andrew S, Вы писали: L>>>>Все так, только какой смысл тут делать sleep, если можно сразу в kernel wait уйти. AS>>>Пример кода приведите, который в kernel wait уходит? L>>Создание именованного ивента + Wait на нем. AS>Вообще то тут мы от этого пытаемся избавиться Я его в общем-то вполне нормально смотрел. AS> interlocked. Далее может идти все что угодно, что обеспечит мемори барриер до и после конструирования объекта и серийность входа. А я и не предлагаю убирать interlock и двойную, я предлагаю заменить спин-лок на kernel wait. AS>>>Вам тут надо переключить конекст (т.е. усыпить тред до следующего shedule) — в виндовс это делается при помощи Sleep. L>>Wait как раз и вызовет переключение контекста. AS>Sleep(1) тоже. А если слипа не будет — то тред, попавший в цикл по interlocked, не будет отдавать время и соотв, будет потреблять все процессорное время. Думаю, пользователям (да и инициализирующемуся в это время объекту синглтона) это не очень понравится А я где-то предполагал другое? AS>И, еще раз — приведенный код (с auto_lock) будет вызываться от силы раз-два, и то при первом обращении к синглтону. Смысл создавать именованый kernel объект и Далеко не факт. Если синглтон долго инициализируется, то вызываться он может много раз. AS> засорять тем самым пространство имен? В общем, повторюсь, предложенный вариант Ты боишься засорить пространство имен одним именованным ивентом? Это как-то совсем несерьезно звучит. AS> будет вполне корректно работать на win32 (и, вероятно, с yield вместо sleep на linux — тут я не уверен, и прочитка топика, который привели вы, выяснила только одну проблему — что в линксовской используется счетчик (__atomic_add), а не просто обмен значениями, как в реализации, приведенной для win32 WolfHound'ом. Но это уже проблемы ДНК тех, кто писал эту реализацию, по моему глубокому убеждению. I love В таком случае проблемы в ДНК есть у всех программистов. AS> gnu libs code В общем-то, этот топик кроме всего прочего обсуждал как раз вредность чистых спин-локов. Именно эту идею я и пытаюсь отстаивать. Кстати, я не привел конец этой дискуссии, так вот там народ сошелся на том, что lightweight_mutex пригоден только для очень коротких операций. В остальных случаях его лучше не использовать. Ты можешь гарантировать, что инициализация синглетона — быстрый процесс? AS> В общем — главный плюс этого кода не то, что он быстрее или медленнее нативных именованых объектов, предоставляемых ОС, а то, что он их собственно не требует, позволяя не засорять пространство имен на одноразовое фактически использование. Это как раз совершенно не серьезное преимущество. В общем, я могу предложить вариант, который наверное устроит и тебя и меня. Сделать синглетон-критическую секцию, создание которой защитить lightweight_mutex'ом (создание тут быстрое, так что можно). И вот эту критическую секцию и использовать при инициализации остальных синглетонов. ... << RSDN@Home 1.1.4 beta 1 >> How is it going to end? |
| Re[16]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 19.07.04 07:38 |
| L>Это как раз совершенно не серьезное преимущество. L>В общем, я могу предложить вариант, который наверное устроит и тебя и меня. L>Сделать синглетон-критическую секцию, создание которой защитить lightweight_mutex'ом (создание тут быстрое, так что можно). И вот эту критическую секцию и использовать при инициализации остальных синглетонов. Одну критическую секция на все? Несерьезно, тормоза будут дикие, более того может быть так, что создание одного синглтона зависит от другого, и это происходит в разных потоках. Придется все-равно по одному именованному объекту на синглтон. Мне кажется, это не очень хорошая мысль. А точнее, очень _не_ хорошая. Впрочем, каждому свое В любом случае, серебряной пули не существует... http://www.rusyaz.ru/pr — стараемся писАть по-русски |
| Re[18]: thread safe singlton - возможно ли такое в принципе | |
| От: | WolfHound модератор | ||
| Дата: | 21.07.04 17:50 |
| Здравствуйте, Lexey, Вы писали: AS>>Одну критическую секция на все? Несерьезно, тормоза будут дикие, более того может L>Совсем не обязательно. Можно, например, сделать шаблонную "фабрику" критических секций. Гм??? А можно подробней? ... << RSDN@Home 1.1.3 beta 1 >> Пусть это будет просто: просто, как только можно, но не проще. (C) А. Эйнштейн |
| Re[19]: thread safe singlton - возможно ли такое в принципе | |
| От: | Andrew S | ||
| Дата: | 21.07.04 20:12 |
| AS>>>Одну критическую секция на все? Несерьезно, тормоза будут дикие, более того может L>>Совсем не обязательно. Можно, например, сделать шаблонную "фабрику" критических секций. WH>Гм??? А можно подробней? Как я понял, предлагается сделать синглтон (точнее, даже, фабрику), производящую объекты — критические секции Немного пояснений. Как я понял — основные претензии к реализации авто лока у Lexey — это то, что "защищенный им код должен выполняться очень непродолжительное время". Это мягко говоря не так в случае win32 — там все вполне пристойно. А вот в линукс реализации используется декремент\инкремент при каждой "прокрутке", т.е. операция захвата выполняется не атомарно.
Но повторюсь, это конкретная реализация. Я, к сожалению, не знаю линукс настолько, чтобы судить о возможности там сделать по-другому (т.е. не инкрементом, а обменом), но, очевидно, операция установки флага "занятости" автолока должна быть атомарной, ни в первом, ни во втором
(тут, правда, я смог придумать только вариант с MAX_UINT — 1 тредов, одновременно захватывающих автолок) приведенном варианте это не соблюдено. http://www.rusyaz.ru/pr — стараемся писАть по-русски |