Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikronМне просто интересно, на каких процессорах ты тестируеш? Тероретически на Итаниумах таки да, запись/увеличение счётчика не синхонизирует кеш лайнс. На Х86 кеши всегда когерентны. но вроде не всегда на АМД64. У них более слабая модель памяти чем Х86 но более строгая чем на итаниумах. Что за железо? А то выяснится, что как ты не показывай проблему, у всех интелы :)У меня Core i7. Во-первых, конкретно в этом коде проблема не в железе, а в JIT. Если вы дизассемблируете этот код, то увидите, что оптимизатор целиком выкосил проверку if (queue.Count > 0), отсюда и зависание. Во-вторых, вы верно заметили, что на x86 архитектурах как правило применяют достаточно строгую и консервативную модель памяти, которая запрещает реордеринг сторов. Она так и называется - TSO - total store order. Но она не запрещает реордеринг лоадов, поэтому вот такой код (это некая адаптация алгоритма Петерсона) на x86 не работает: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. Если вы немного помедитируете над этим кодом, то увидите, что если только одна из переменных runner1WasFirst или runner2WasFirst может быть true, верно? Ну то есть нельзя на бумажке нарисовать такой сценарий, где обе эти переменных будут true. Однако, x86, в том числе мой Core i7 не гарантирует когерентности кэшей . Поэтому он спокойно может переколбасить код вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. И все, ваш код сломан - у вас два бегуна прибежали первым, что невозможно. Хотя TSO сохранен. Более того, точно такой же эффект может возникнуть не только от реордеринга инструкций, но и от того, что кэши всегда становятся когерентными со временем, но не всегда когерентны в моменте. Поэтому один поток может записать флажок, а другой это не увидит. Почитайте про store buffer и invalidate queue на досуге. Кстати, примерно этот же пример приведен прямо в документации интеловских процессоров. Если очень надо будет - дам вам ссылку. В любом случае, в рассматриваемом нами некорретном коде от Arm79 проблема не в железе, а в JIT-компиляторе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 19:19 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvУ меня Core i7. В любом случае, в рассматриваемом нами некорретном коде от Arm79 проблема не в железе, а в JIT-компиляторе. Я таки читал что кеши в х86 и х64 когерены. Но оставим кеши в стороне. В твоём примере вынисти чтение за цикл - валидная оптимизация. И таки да, проблема должна быть видна даже на однопроцесорном тазике. Только не надо на компилятор. Проблем точно не в нём. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 19:46 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron, Нет, кэши не когерентны. Повторюсь - читайте про store buffer и invalidate queue. Виной тому, что код не останавливается - именно компмлятор, и никто иной. Это сгенерировал такой ассембли, в котором проверка вынесена за цикл. Процессор так делать не умеет, он вообще не знант, что такое «цикл». Но разумеется, это не «проблема» и не баг. Это ожидаемое поведение. Проблема у нас сейчас только в том, что коллеги Arm79 и SkyAnA не умеют писать многопоточный код. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 19:54 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
ЕвгенийВcodearticles.ru, Делай что нибудь полезное, а не жди. Ты признаёшь, что опростоволосился? Ответь, будь мужчиной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 20:41 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvНет, кэши не когерентны. Повторюсь - читайте про store buffer и invalidate queue. Пакажи источник информации что кэши у х86 и х64 не когерентны. И может сможеш показать на примере? И ненадо стигматизировать личности. Ошибки вобще свойственны людям. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 21:23 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikroncdtyjvНет, кэши не когерентны. Повторюсь - читайте про store buffer и invalidate queue. Пакажи источник информации что кэши у х86 и х64 не когерентны. И может сможеш показать на примере? И ненадо стигматизировать личности. Ошибки вобще свойственны людям.Давайте для начала будем употреблять термин "когерентны" правильно. Утверждение "кэши не когерентны" не верно - они тогда бы просто напросто не работали. Утверждение "кэши когерентны" не верно - они могут временно разъезжаться. Правильнее всего сказать - "кэши eventually когерентны". Извиняюсь, не знаю более подходящего слова на русском. То есть они "когерентны со временем". Теперь по ссылкам. 1. Идем в Гугл: https://www.google.ru/?q=intel developer manual 2. Оттуда на сайт Интела: http://www.intel.com/content/www/us/en/processors/architectures-software-developer-manuals.html 3. Жмем Ctrl-F, ищем по слову "memory". 4. Понимаем, что был некий вайтпапир про память, который смержили в главу 3A, открываем ее: http://www.intel.com/content/dam/www/public/us/en/documents/manuals/64-ia-32-architectures-software-developer-vol-3a-part-1-manual.pdf 5. Пробегаемся по оглавлению, замечаем главу 8.2 Memory Ordering, идем в нее. 6. Тут уж почитаете, что вам интересно. Например, 8.2.3.4 - это пример, который я приводил выше. А 8.2.3.5 - это ответ на ваш вопрос , как раз показывает, что когерентность может нарушаться. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 21:39 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
codearticles.ruЕвгенийВcodearticles.ru, Делай что нибудь полезное, а не жди. Ты признаёшь, что опростоволосился? Ответь, будь мужчиной. а ты все же попробуй ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.09.2014, 22:28 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Не флеима ради. Опять вникал в тему и два источника противоречат друг другу. вот интересно кто прав. The C# memory model permits reordering of memory operations in a method, as long as the behavior of single-threaded execution doesn’t change. For example, the compiler and the processor are free to reorder the Init method operations as follows: Strong Model 2: .NET Framework 2.0: ... 4.Writes cannot move past other writes from the same thread. Кто знает правилный ответ в терминах "C# memory model"? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:02 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron , Первая ссылка правильная. Вторая ссылка тоже была правильной ... в то время, когда публиковалась :-) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:14 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjv mikron , Первая ссылка правильная. Вторая ссылка тоже была правильной ... в то время, когда публиковалась :-) А мне первая не нравится своим заголовком: "C# Memory Model According to ECMA-334". В терминах етой модели он прав, но во втором посте автор опятъ ссылается на предидушее заявление, но уже с CLR 4.5. К тому-же преведённый тобой документ тоже подтвержадет "Writes cannot move past other writes from the same thread." "8.2.2 Memory Ordering in P6 and More Recent Processor Families" -- Writes to memory are not reordered with other writes, with the following ... -- Writes by a single processor are observed in the same order by all processors. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:30 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikronК тому-же преведённый тобой документ тоже подтвержадет "Writes cannot move past other writes from the same thread." "8.2.2 Memory Ordering in P6 and More Recent Processor Families" -- Writes to memory are not reordered with other writes, with the following ... -- Writes by a single processor are observed in the same order by all processors.Ну все верно, именно так x86 и работают (см. total store order). Но в чем вопрос ваш заключается? Да, сторы не могут "заезжать" друг за друга на одном процессоре. Но это не гарантирует когерентности кэшей, что как раз и проиллюстрировано в примерах из спецификации Intel-овских процессоров, которые я вам приводил. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:36 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
И вот человек говорит странное As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword — so this keyword has no effect on the hardware if you’re using these processors. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:38 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
Давате котлеты от мух отдельно а то скоро мы смешаем смежные и взаимосщязанные но не идентичные темы. первое противоречие в ответе на вопрос: могут ли присваивания быть переупорядочены в терминах "CLR memory model" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:47 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikronИ вот человек говорит странное As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword — so this keyword has no effect on the hardware if you’re using these processors. Нет, это неверно. На самом деле, ситуация следующая. Давайте определим 4 типа "фенсов": LoadLoad, LoadStore, StoreLoad, StoreStore. Например, "LoadStore" означает, что последующе сторы не могут быть поставлены до лоада, защищенного этим фенсом: Код: c# 1. 2. 3. Семантика volatile выглядит вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. Но проблема в том, что в таком варианте int y0 = y может "заехать" за x = 1 в одном потоке, что приведет к вот этому: 16627718 Поэтому на самом деле волатильный стор выглядит вот так: Код: c# 1. 2. 3. 4. На x86 фенсы StoreStore, LoadLoad и LoadStore уже гарантированы архитектурой. А StoreLoad не гарантирован! Поэтому его имплементируют руками, например через "lock add(esp, 0)" или через какие-нибудь mfence. Вывод: volatile работает не так, как обычные переменные даже на x86. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 13:53 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvmikronИ вот человек говорит странное As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword — so this keyword has no effect on the hardware if you’re using these processors. Семантика volatile выглядит вот так: Код: c# 1. 2. 3. 4. 5. 6. 7. Но проблема в том, что в таком варианте int y0 = y может "заехать" за x = 1 в одном потоке, что приведет к вот этому: 16627718 Вывод: volatile работает не так, как обычные переменные даже на x86. Мне сложно следовать ващим мыслям. 1. Я непонимаю каким образом ваши утверждения о волатиле сторе имеют отношения к утверждению "As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword". Автор говорит об общем случае (volatile or not it doesn't matter) а вы скатываетесь к часному (volatile). 2. Ваше утверждение, что "автор не прав" вызывает сомение. В вашем примере для y0 есть сторе и значит по утвержденю автора acquire-fences. И следовательно не может быть переупорядочено. что вы собственно и доказываете. Но причина тому фенсе по утвержденю автора другая. 3. Вывод мне ещё боле непонатен. Спецификация говорит что волатзиле работает по другому. Этому не нужно доказательств, зачем вы делаете вывод для аксиомы? Поясните. 4. И как вы считаете, какой ответе на вопрос: могут ли присваивания быть переупорядочены в терминах "CLR memory model" ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:04 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron"As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword". Автор говорит об общем случае (volatile or not it doesn't matter) а вы скатываетесь к часному (volatile).Вы фразу то целиком пишите. У нее там еще окончание есть, которое вы же и привели: "... so this keyword has no effect on the hardware if you’re using these processors." Я вам и говорю - это неверно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:22 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron2. Ваше утверждение, что "автор не прав" вызывает сомение. В вашем примере для y0 есть сторе и значит по утвержденю автора acquire-fences. И следовательно не может быть переупорядочено. что вы собственно и доказываете. Но причина тому фенсе по утвержденю автора другая.Стора здесь нет. Вернее, может не быть: процессор может сохранить y0 в регистр, и работать там. int y0 = y - это LOAD, а не STORE. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:24 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron2. Ваше утверждение, что "автор не прав" вызывает сомение. В вашем примере для y0 есть сторе и значит по утвержденю автора acquire-fences и release-fences. И следовательно не может быть переупорядочено. что вы собственно и доказываете. Но причина тому фенсе по утвержденю автора другая. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:24 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
mikron4. И как вы считаете, какой ответе на вопрос: могут ли присваивания быть переупорядочены в терминах "CLR memory model"Не знаю. И не знаю, зачем мне это нужно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:25 |
|
||
|
Потокобезопасное использование потоконебезопасных коллекций
|
|||
|---|---|---|---|
|
#18+
cdtyjvmikron"As it happens, Intel’s X86 and X64 processors always apply acquire-fences to reads and release-fences to writes — whether or not you use the volatile keyword". Автор говорит об общем случае (volatile or not it doesn't matter) а вы скатываетесь к часному (volatile).Вы фразу то целиком пишите. У нее там еще окончание есть, которое вы же и привели: "... so this keyword has no effect on the hardware if you’re using these processors." Я вам и говорю - это неверно. Ну тогда уже полноты ради. "However, volatile does have an effect on optimizations performed by the compiler and the CLR — as well as on 64-bit AMD and (to a greater extent) Itanium processors.". Вот мы уже и прешли к разнице между архитектурой и оптимизатором CLR. Даваите вернёмся к "CLR memory model". и оставим в стороне процессорные кеши и аспекты архитектуру. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 29.09.2014, 15:32 |
|
||
|
|

start [/forum/topic.php?fid=20&msg=38760749&tid=1402419]: |
0ms |
get settings: |
9ms |
get forum list: |
11ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
171ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
53ms |
get tp. blocked users: |
1ms |
| others: | 14ms |
| total: | 276ms |

| 0 / 0 |
