| 1 2 3 4 |
| 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[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? |
| 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 — стараемся писАть по-русски |
| 1 2 3 4 |