powered by simpleCommunicator - 2.0.55     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему в .Net такие кривые Lock'и?
25 сообщений из 67, страница 2 из 3
Почему в .Net такие кривые Lock'и?
    #38705447
Фотография skyANA
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79в каком конкретно кейсе вы вынуждены применить volatile? 16353282
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705450
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
skyANAArm79в каком конкретно кейсе вы вынуждены применить volatile? 16353282

Хватит издеваться :-) Я серьезно спрашиваю.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705460
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
gandjustasvolatile не сериализует доступ, в MSDN не точное описание. volatile не является средством синхронизации для многопроцессорных компьютеров.
да, это так.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705463
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилgandjustasvolatile не сериализует доступ, в MSDN не точное описание. volatile не является средством синхронизации для многопроцессорных компьютеров.
да, это так.Нет, это не так. volatile и сериализует доступ к конкретной переменной (напр. к long на 32-битной платформе), и является примитивом синхронизации благодаря окружающим его барьерам памяти.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705465
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНет, это не так. volatile и сериализует доступ к конкретной переменной (напр. к long на 32-битной платформе), и является примитивом синхронизации благодаря окружающим его барьерам памяти.

Ты вообще не понимаешь что такое volatile . Может хоть один букварь откроешь наконец, а? Выглядишь глупо, честно.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705473
gandjustas
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
D129gandjustasпропущено...

А как же асинхронность?
А бывает что ресурс уникальный.
Конкретно писал поиск наилучшей полки.
Когда находим - помечаем, занято.
Другие вызовы этого же сервиса (ну в случае многих вьездов в склад, и тп) - ставим в очередь,
Чтобы не отправить реальных два ящика на одну и ту же полку.

Interlocked.CompareExchange не? Это если данные в памяти, а если это база, то уникальный индекс на (полка, место).
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705474
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttТы вообще не понимаешь что такое volatile . Может хоть один букварь откроешь наконец, а? Выглядишь глупо, честно.Хм, то есть volatile не гарантирует атомарность записи, и вокруг него нет барьеров?
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705481
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvХм, то есть volatile не гарантирует атомарность записи, и вокруг него нет барьеров?

Я ещё раз настоятельно рекомендую открыть букварь и почитать:

1. Что делает модификатор volatile
2. Как это связано с архитектурой процессора, на котором будет исполняться приложение
3. Зачем нужен и когда применяется volatile
4. Какие даёт гарантии volatile , а каких гарантий он не даёт

Когда разберёшься, у тебя все вопросы сразу отпадут по поводу того, почему принципиально и технически в среде .NET (на сегодняшний день) нельзя объявить volatile long и double . Ты отчётливо поймёшь почему. И поймёшь, что на месте разработчиков ты бы сделал также.

Возможно ты тупо наезжаешь на синтаксис и обижаешься на то, почему в C# нельзя было сделать ключевое слово volatile «синтаксическим сахаром», который бы придавал «волатильности» чему угодно. Я бы понял такой наезд в отношение VisualBasic.NET, но никак не для C#, который часто применяется для написания высоконагруженных приложений, где volatile должен быть именно тем, чем он на самом деле является, а не каким-то «сахаром» в угоду всяким раздолбаям типо тебя
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705486
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

В конце концов открой уже для себя Volatile из .NET 4.5 и не выкалупывай форумчанам мозг на ровном месте.

Можешь даже состряпать свой struct CdtyjvVolatile<T>, ведь платформа даёт тебе все карты в руки. Действуй!
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705487
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,
летучесть это фишка записи и чтения данных процессора в контексте его кеша( процессора), если два разных потока
крутятся на разных ядрах , работат с переменными оптимизирована через кеш каждого процессора, то есть фактическое изменение
переменной задерживается в кеше, а если оно задерживается то второе ядро не может получить реальное значение.
volatile дает команду процессору изменить значение переменной минуя ее копию в кеше ( сквозное изменение) и автоматом объявляет кеш не действительным - отсюда и вся гадость со скоростью доступа к кешу ядра ( приходится опять заныривать в оперативку).
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705490
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttКогда разберёшься, у тебя все вопросы сразу отпадут по поводу того, почему принципиально и технически в среде .NET (на сегодняшний день) нельзя объявить volatile long и double . Ты отчётливо поймёшь почему. И поймёшь, что на месте разработчиков ты бы сделал также.А вы не можете мне ответить на этот вопрос? Почему нельзя?
Вот я работаю в 64-битной среде, у меня есть ссылка, она занимает 8 байт. Ее можно объявить volatile.
Вот я работаю в 64-битной среде, и у меня есть long. Ее нельзя объявить volatile.
Но при этом у меня есть Thread.VolatileRead(ref long), где long все таки можно читать/писать как volatile, вне зависимости от того, сижу я в 64-битной или 32-битной среде.
Что я не понимаю?
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705491
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степи,

как ни печально, эти рассуждения к архитектуре x86/64 отношения не имеют
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705493
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНо при этом у меня есть Thread.VolatileRead(ref long
вскрытие показывает, что на 32 бит он не атомарен. селяви
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705495
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степиcdtyjv,
летучесть это фишка записи и чтения данных процессора в контексте его кеша( процессора), если два разных потока
крутятся на разных ядрах , работат с переменными оптимизирована через кеш каждого процессора, то есть фактическое изменение
переменной задерживается в кеше, а если оно задерживается то второе ядро не может получить реальное значение.
volatile дает команду процессору изменить значение переменной минуя ее копию в кеше ( сквозное изменение) и автоматом объявляет кеш не действительным - отсюда и вся гадость со скоростью доступа к кешу ядра ( приходится опять заныривать в оперативку).Ну вы совершенно не правы. volatile переменные сидят в кэше так же, как и все остальные. Они отличаются от обычных переменныъ только двумя вещами:
1) Компилятору запрещено оптимизирвоать доступ к ним. То есть, если у меня в коде идет два чтения volatile, то register allocator компилятора не может прочитать ее один раз, сохранить в регистр, а второй раз прочитать копию из него. Он обязан дважда обратиться в подсистему памяти (а подсистема памяти - это кэщ + оперативка, процессор их не отличает друг от друга).
2) Вокруг доступов к волатильным переменным выставляют барьеры, которые гарантируют синхронизацию кэшей разных ядер. Не то, что "переменная будет прочитана из памяти, а не из кэша" - это распространенное заблуждение. А то, что на записи волатиля ядро сбросит store buffer своего кэша в кэши других ядер, я чтение волатиля сначала обработает invalidate queue своего ядра, и лишь потом ее прочитает (либо из памяти, либо из кэша другого ядра через механизм snooping'а).
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705502
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvНо при этом у меня есть Thread.VolatileRead(ref long), где long все таки можно читать/писать как volatile, вне зависимости от того, сижу я в 64-битной или 32-битной среде.
Что я не понимаю?

Разницу не понимаешь между определением и операцией. Модификатор volatile инструктирует компилятор избегать оптимизации при работе с переменной. Любой код, который использует эту переменную, не будет оптимизирован в отношение этой переменной. А конкретно ты можешь «волатильно» прочитать и записать любой тип.

Сравнивать размеры ссылки и long -- вообще не уместно, так как размер long всегда 64 бита.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705503
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилвскрытие показывает, что на 32 бит он не атомарен. селяви

Свеном полагает, что если он работает на x64, то никаких других систем в мире не существует.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705504
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvОн обязан дважда обратиться в подсистему памяти (а подсистема памяти - это кэщ + оперативка, процессор их не отличает друг от друга).

Атомарности при этом отнюдь не гарантируется.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705506
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ИзопропилcdtyjvНо при этом у меня есть Thread.VolatileRead(ref long
вскрытие показывает, что на 32 бит он не атомарен. селявиДа, действительно. Зато атомарен Interlocked. Еще бОльшая кривота .Net'а.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705507
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvВокруг доступов к волатильным переменным выставляют барьеры

Вот где твой косяк в отношении понимания модификатора volatile и «волатильным» чтением/записью.

И ещё, кажется, что ты путаешь volatile с Interlocked , последний гарантирует атомарность операции, в то время как volatile — отнюдь не гарантирует.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705510
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjvДа, действительно. Зато атомарен Interlocked. Еще бОльшая кривота .Net'а.

Это не кривота, а элементарная безграмотность с твоей стороны. volatile и не должен обеспечивать атомарность, хотя ты почему-то решил иначе. Интересно, почему?
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705512
Фотография Где-то в степи
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,
авторvolatile переменные сидят в кэше так же, как и все остальные
ну сидят в кеше, вам то от этого чем легче, при записи происходит изменение переменной в кеше с последующим сбросом
в основную память и объявлением последнего не действительным, считайте это за сквозную запись, в чем проблем, это уже детали
чтение происходит обычным образом из кеша, то что оно не кешируется в регистрах, так это ежу понятно почему, атомарность
на уровне железа никакой магии..
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705513
Фотография hVostt
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
cdtyjv,

На всякий случай, одно из классических применений volatile , это когда поток 1 изменяет переменную, а поток 2 читает, при этом не обеспечивается 100% гарантия актуального значения переменной в один и тот же момент времени. При этом, если не использовать volatile , поток 2 может так и не увидеть изменений, или получать совсем не актуальное значение.

Для синхронизации потоков, volatile категорически не используется, как и «волатильные» чтение/запись.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705516
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 погуглите - та же самая концепция.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705517
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hVosttВот где твой косяк в отношении понимания модификатора volatile и «волатильным» чтением/записью.

И ещё, кажется, что ты путаешь volatile с Interlocked , последний гарантирует атомарность операции, в то время как volatile — отнюдь не гарантирует.Да, так и есть. Просто криворукие разработчики .Net решили не давать гарантии атомарности long/double, из-за чего и возник весь сыр-бор с невозможностью объявить их volatile, а оттуда же выросли проблемы с дженериками, которые так же нельзя объявить волатилями. Одно тупое решение какого-то неквалифицированного индуса, и API .Net превратился в гомно.
...
Рейтинг: 0 / 0
Почему в .Net такие кривые Lock'и?
    #38705518
cdtyjv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Где-то в степину сидят в кеше, вам то от этого чем легче, при записи происходит изменение переменной в кеше с последующим сбросом в основную память и объявлением последнего не действительнымЭто неправда. Тактика процессора в одношении "сброса" данных из кэшей в память относительно волатильных и неволатильных переменных одинакова. Это следуте из того простого факта, что если вы посмотрите на соответствующий ассемблерный код, то увидите, что и обычная запись, и волатиьлная - это просто инструкция mov. Нет способа сказать процессору, что это волатиьлная переменная, а эта нет. Он их не отличает. Но вокруг волатильных переменных компилятор добавляет барьеры (например, cmpxchg), которые гарантируют частичную синхронизацию состяний кешей между собой, а не между кэшем и памятью.
...
Рейтинг: 0 / 0
25 сообщений из 67, страница 2 из 3
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Почему в .Net такие кривые Lock'и?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]