|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
Arm79в каком конкретно кейсе вы вынуждены применить volatile? 16353282 ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 21:24 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
skyANAArm79в каком конкретно кейсе вы вынуждены применить volatile? 16353282 Хватит издеваться :-) Я серьезно спрашиваю. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 21:31 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
gandjustasvolatile не сериализует доступ, в MSDN не точное описание. volatile не является средством синхронизации для многопроцессорных компьютеров. да, это так. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 22:07 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
Изопропилgandjustasvolatile не сериализует доступ, в MSDN не точное описание. volatile не является средством синхронизации для многопроцессорных компьютеров. да, это так.Нет, это не так. volatile и сериализует доступ к конкретной переменной (напр. к long на 32-битной платформе), и является примитивом синхронизации благодаря окружающим его барьерам памяти. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 22:12 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjvНет, это не так. volatile и сериализует доступ к конкретной переменной (напр. к long на 32-битной платформе), и является примитивом синхронизации благодаря окружающим его барьерам памяти. Ты вообще не понимаешь что такое volatile . Может хоть один букварь откроешь наконец, а? Выглядишь глупо, честно. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 22:26 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
D129gandjustasпропущено... А как же асинхронность? А бывает что ресурс уникальный. Конкретно писал поиск наилучшей полки. Когда находим - помечаем, занято. Другие вызовы этого же сервиса (ну в случае многих вьездов в склад, и тп) - ставим в очередь, Чтобы не отправить реальных два ящика на одну и ту же полку. Interlocked.CompareExchange не? Это если данные в памяти, а если это база, то уникальный индекс на (полка, место). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 22:55 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
hVosttТы вообще не понимаешь что такое volatile . Может хоть один букварь откроешь наконец, а? Выглядишь глупо, честно.Хм, то есть volatile не гарантирует атомарность записи, и вокруг него нет барьеров? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 22:55 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjvХм, то есть volatile не гарантирует атомарность записи, и вокруг него нет барьеров? Я ещё раз настоятельно рекомендую открыть букварь и почитать: 1. Что делает модификатор volatile 2. Как это связано с архитектурой процессора, на котором будет исполняться приложение 3. Зачем нужен и когда применяется volatile 4. Какие даёт гарантии volatile , а каких гарантий он не даёт Когда разберёшься, у тебя все вопросы сразу отпадут по поводу того, почему принципиально и технически в среде .NET (на сегодняшний день) нельзя объявить volatile long и double . Ты отчётливо поймёшь почему. И поймёшь, что на месте разработчиков ты бы сделал также. Возможно ты тупо наезжаешь на синтаксис и обижаешься на то, почему в C# нельзя было сделать ключевое слово volatile «синтаксическим сахаром», который бы придавал «волатильности» чему угодно. Я бы понял такой наезд в отношение VisualBasic.NET, но никак не для C#, который часто применяется для написания высоконагруженных приложений, где volatile должен быть именно тем, чем он на самом деле является, а не каким-то «сахаром» в угоду всяким раздолбаям типо тебя ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:22 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjv, В конце концов открой уже для себя Volatile из .NET 4.5 и не выкалупывай форумчанам мозг на ровном месте. Можешь даже состряпать свой struct CdtyjvVolatile<T>, ведь платформа даёт тебе все карты в руки. Действуй! ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:32 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjv, летучесть это фишка записи и чтения данных процессора в контексте его кеша( процессора), если два разных потока крутятся на разных ядрах , работат с переменными оптимизирована через кеш каждого процессора, то есть фактическое изменение переменной задерживается в кеше, а если оно задерживается то второе ядро не может получить реальное значение. volatile дает команду процессору изменить значение переменной минуя ее копию в кеше ( сквозное изменение) и автоматом объявляет кеш не действительным - отсюда и вся гадость со скоростью доступа к кешу ядра ( приходится опять заныривать в оперативку). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:33 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
hVosttКогда разберёшься, у тебя все вопросы сразу отпадут по поводу того, почему принципиально и технически в среде .NET (на сегодняшний день) нельзя объявить volatile long и double . Ты отчётливо поймёшь почему. И поймёшь, что на месте разработчиков ты бы сделал также.А вы не можете мне ответить на этот вопрос? Почему нельзя? Вот я работаю в 64-битной среде, у меня есть ссылка, она занимает 8 байт. Ее можно объявить volatile. Вот я работаю в 64-битной среде, и у меня есть long. Ее нельзя объявить volatile. Но при этом у меня есть Thread.VolatileRead(ref long), где long все таки можно читать/писать как volatile, вне зависимости от того, сижу я в 64-битной или 32-битной среде. Что я не понимаю? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:36 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
Где-то в степи, как ни печально, эти рассуждения к архитектуре x86/64 отношения не имеют ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:37 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjvНо при этом у меня есть Thread.VolatileRead(ref long вскрытие показывает, что на 32 бит он не атомарен. селяви ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:39 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
Где-то в степиcdtyjv, летучесть это фишка записи и чтения данных процессора в контексте его кеша( процессора), если два разных потока крутятся на разных ядрах , работат с переменными оптимизирована через кеш каждого процессора, то есть фактическое изменение переменной задерживается в кеше, а если оно задерживается то второе ядро не может получить реальное значение. volatile дает команду процессору изменить значение переменной минуя ее копию в кеше ( сквозное изменение) и автоматом объявляет кеш не действительным - отсюда и вся гадость со скоростью доступа к кешу ядра ( приходится опять заныривать в оперативку).Ну вы совершенно не правы. volatile переменные сидят в кэше так же, как и все остальные. Они отличаются от обычных переменныъ только двумя вещами: 1) Компилятору запрещено оптимизирвоать доступ к ним. То есть, если у меня в коде идет два чтения volatile, то register allocator компилятора не может прочитать ее один раз, сохранить в регистр, а второй раз прочитать копию из него. Он обязан дважда обратиться в подсистему памяти (а подсистема памяти - это кэщ + оперативка, процессор их не отличает друг от друга). 2) Вокруг доступов к волатильным переменным выставляют барьеры, которые гарантируют синхронизацию кэшей разных ядер. Не то, что "переменная будет прочитана из памяти, а не из кэша" - это распространенное заблуждение. А то, что на записи волатиля ядро сбросит store buffer своего кэша в кэши других ядер, я чтение волатиля сначала обработает invalidate queue своего ядра, и лишь потом ее прочитает (либо из памяти, либо из кэша другого ядра через механизм snooping'а). ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:41 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjvНо при этом у меня есть Thread.VolatileRead(ref long), где long все таки можно читать/писать как volatile, вне зависимости от того, сижу я в 64-битной или 32-битной среде. Что я не понимаю? Разницу не понимаешь между определением и операцией. Модификатор volatile инструктирует компилятор избегать оптимизации при работе с переменной. Любой код, который использует эту переменную, не будет оптимизирован в отношение этой переменной. А конкретно ты можешь «волатильно» прочитать и записать любой тип. Сравнивать размеры ссылки и long -- вообще не уместно, так как размер long всегда 64 бита. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:45 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
Изопропилвскрытие показывает, что на 32 бит он не атомарен. селяви Свеном полагает, что если он работает на x64, то никаких других систем в мире не существует. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:47 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjvОн обязан дважда обратиться в подсистему памяти (а подсистема памяти - это кэщ + оперативка, процессор их не отличает друг от друга). Атомарности при этом отнюдь не гарантируется. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:51 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
ИзопропилcdtyjvНо при этом у меня есть Thread.VolatileRead(ref long вскрытие показывает, что на 32 бит он не атомарен. селявиДа, действительно. Зато атомарен Interlocked. Еще бОльшая кривота .Net'а. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:53 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjvВокруг доступов к волатильным переменным выставляют барьеры Вот где твой косяк в отношении понимания модификатора volatile и «волатильным» чтением/записью. И ещё, кажется, что ты путаешь volatile с Interlocked , последний гарантирует атомарность операции, в то время как volatile — отнюдь не гарантирует. ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:57 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjvДа, действительно. Зато атомарен Interlocked. Еще бОльшая кривота .Net'а. Это не кривота, а элементарная безграмотность с твоей стороны. volatile и не должен обеспечивать атомарность, хотя ты почему-то решил иначе. Интересно, почему? ... |
|||
:
Нравится:
Не нравится:
|
|||
24.07.2014, 23:59 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjv, авторvolatile переменные сидят в кэше так же, как и все остальные ну сидят в кеше, вам то от этого чем легче, при записи происходит изменение переменной в кеше с последующим сбросом в основную память и объявлением последнего не действительным, считайте это за сквозную запись, в чем проблем, это уже детали чтение происходит обычным образом из кеша, то что оно не кешируется в регистрах, так это ежу понятно почему, атомарность на уровне железа никакой магии.. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2014, 00:04 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
cdtyjv, На всякий случай, одно из классических применений volatile , это когда поток 1 изменяет переменную, а поток 2 читает, при этом не обеспечивается 100% гарантия актуального значения переменной в один и тот же момент времени. При этом, если не использовать volatile , поток 2 может так и не увидеть изменений, или получать совсем не актуальное значение. Для синхронизации потоков, volatile категорически не используется, как и «волатильные» чтение/запись. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2014, 00:08 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
hVosttcdtyjv, На всякий случай, одно из классических применений volatile , это когда поток 1 изменяет переменную, а поток 2 читает, при этом не обеспечивается 100% гарантия актуального значения переменной в один и тот же момент времени. При этом, если не использовать volatile , поток 2 может так и не увидеть изменений, или получать совсем не актуальное значение. Для синхронизации потоков, volatile категорически не используется, как и «волатильные» чтение/запись.Угу, не используется. Например, вот здесь это не используется http://referencesource.microsoft.com/#mscorlib/system/threading/SpinLock.cs Все современные синхронайзеры, будь то ReentrantReadWriteLock в Java или какой-нибудь ReaderWriteLockSlim в Net ( http://reflector.webtropy.com/default.aspx/4@0/4@0/untmp/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/fx/src/Core/System/Threading/ReaderWriterLockSlim/ReaderWriterLockSlim@cs/1305376/ReaderWriterLockSlim@cs)]http://reflector.webtropy.com/default.aspx/4@0/4@0/untmp/DEVDIV_TFS/Dev10/Releases/RTMRel/ndp/fx/src/Core/System/Threading/ReaderWriterLockSlim/ReaderWriterLockSlim@cs/1305376/ReaderWriterLockSlim@cs) используют volatile/interlocked для попытки быстрого захвата ресурса, читай - быстрого занятия критической секции. А если это не получается, то они идут в ОС, и просят ее о помощи. По слову futex погуглите - та же самая концепция. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2014, 00:17 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
hVosttВот где твой косяк в отношении понимания модификатора volatile и «волатильным» чтением/записью. И ещё, кажется, что ты путаешь volatile с Interlocked , последний гарантирует атомарность операции, в то время как volatile — отнюдь не гарантирует.Да, так и есть. Просто криворукие разработчики .Net решили не давать гарантии атомарности long/double, из-за чего и возник весь сыр-бор с невозможностью объявить их volatile, а оттуда же выросли проблемы с дженериками, которые так же нельзя объявить волатилями. Одно тупое решение какого-то неквалифицированного индуса, и API .Net превратился в гомно. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2014, 00:19 |
|
Почему в .Net такие кривые Lock'и?
|
|||
---|---|---|---|
#18+
Где-то в степину сидят в кеше, вам то от этого чем легче, при записи происходит изменение переменной в кеше с последующим сбросом в основную память и объявлением последнего не действительнымЭто неправда. Тактика процессора в одношении "сброса" данных из кэшей в память относительно волатильных и неволатильных переменных одинакова. Это следуте из того простого факта, что если вы посмотрите на соответствующий ассемблерный код, то увидите, что и обычная запись, и волатиьлная - это просто инструкция mov. Нет способа сказать процессору, что это волатиьлная переменная, а эта нет. Он их не отличает. Но вокруг волатильных переменных компилятор добавляет барьеры (например, cmpxchg), которые гарантируют частичную синхронизацию состяний кешей между собой, а не между кэшем и памятью. ... |
|||
:
Нравится:
Не нравится:
|
|||
25.07.2014, 00:22 |
|
|
start [/forum/topic.php?fid=20&msg=38705493&tid=1402671]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
32ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 14ms |
total: | 142ms |
0 / 0 |