Re[7]: Многопоточность
От: vlp  
Дата: 22.12.20 18:48
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Здравствуйте, vlp, Вы писали:


Ф>>>volatile это инструкция компилятору "не оптимизировать обращение к полю". Из-за таких оптимизаций чтение пожет быть "оптимизировано".


vlp>>Как именно нужно написать код, чтобы без volatile значение поля disposed было stale из-за "оптимизаций"? Этого и без volatile не происходит. Чтобы происходило нужна не одна проверка в начале функции (она точно из памяти читает), а хотя бы цикл с проверкой. Очень хотелось бы увидеть контрпример в виде кода и результаты дизассемблера.


Ф>Примеры дизассемблера тебе ничего не дадут: сегодня это один пример, а завтра версия джиттера поменяется.

Я просил пример того, как прямо сейчас, с текущей версией компилятора и джиттера, возможна ситуация, которой тут всех пугают и как volatile в ней помогает.
Тут, судя по ответам, в треде одни философы-теоретики, примеров нет.

>Для того, чтобы зачитанное значение могло застрять в регистре, достаточно несколько подряд вызовов, дёргающих ThrowIfDisposed(), например:


Ф>Connect()

Ф>Read()
Ф>Send()

Покажите скомпилированный код + дизассемблер кода, который в этом случае будет зачем-то записывать значение disposed в регистр и его потом переиспользовать. На практике и без volatile этого не делается, вместо этого значение всегда читается из памяти (почему-объяснять относительно долго)/

Ф>Такие вещи стреляют редко, но если стреляют, то хоть вешайся.

Чтобы это выстрелило, надо использовать disposed сокет. А race condition дебагать действительно тяжело, да.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.