Re[43]: Безопасность Rust
От: vdimas Россия  
Дата: 04.06.19 07:04
Оценка:
Здравствуйте, ·, Вы писали:

·>После очередной подмены тезис стал заключаться в том, что atomic<int>+relaxed и volatile sig_atomic_t — оба атомарны с т.з. многопоточности т.к. генерят одинаковый код. Я показал, что иногда генерится разный код. ЧТД.


Не-не-не, Дэвид Блэйн, вы показывали Алексу, что в одном случае атомарность, а в другом нет.
Тем самым ты и Сайберикс показали, что не понимаете, что есть атомарность, путаете её с упорядочиванием/синхронизацией.

А я лишь утверждал о требовании записи значения в память в одну инструкцию из-за работы в условиях прерываний.
Для x86 таких инструкций несколько, кстате.


·>Но ты снова подменяешь тезис какими-то конкретными имплементациями:


Я показал тебе, что не понимаешь ассемблерного кода, который сам же привёл.


V>>У тебя по ссылке swap, но чтение содержимого переменной не требовалось, там безусловная запись, поэтому, скорее всего, будет работать "can optimize away fetching the original value".

·>И что, что скорее всего? А иногда и нет. Типичный UB.

В голос уже ))
1. "Скорее всего" относится не к описанному поведению, а к конкректной реализации проца под этот ассемблер;
2. Даже если в какой-то из реализаци в этой команде будет происходить не store, а swap — во втором случае всё-равно никакого UB.


V>>Итого, когда биты aq=0 и rl=0 у этих операций и чтение значения не требуется (см в твоём примере amoswap.w zero, ...), семантика происходящего не будет отличаться от простого sw.

·>Если implement AMOs at memory controllers. А если нет?

То на уровне проца, вестимо.
А у тебя какие варианты?


V>>If the address is not naturally aligned, a misaligned address exception will be generated.

·>Ты хочешь сказать, что это единственная причина?

Да.
Это слишком веская причина.
Лично я бы предпочел иметь в x86/x86_x64 инструкции, которые генерят аналогичное прерывание в случае нарушения выравнивания.
Что характерно, что в x86/x86_x64 если невыровненное значение попадай на край линейки кеша, то прерыванеи происходит ВСЕГДА, но это прерывание перехвачено операционкой и операционка сама "ручками" разруливает такую ситуацию, копируя это значение побайтно. Т.е. и эффективность падает и атомарности никакой, а программист и не в курсе. Хотелось бы иметь возможность каким-либо образом указывать в некоторых случаях на то, что ничего разруливать не надо, надо явно сигнализировать об ошибке.


·>Почему тогда сгенерился такой код? Ведь компилятор явно знает, что оно aligned.


Ты так говоришь, будто современные компиляторы — верх разума.
Это шаблон генерации, скорее всего, который работает для разных случаев адресации в том числе.
Я дважды находил ошибки в gcc в разное время, а тут и ошибки-то нет, придраться не к чему.

Могу показать выход работы, например, JIT дотнета, где происходят явные глупости, которые хотелось бы исправить.
Т.е. не боги горшки обжигают, а обычные люди, не большей квалификации, чем в среднем участники этого форума.


·>В любом случае, даже если risc и все известные архитектуры будут атомик по самые гланды, это не меняет того факта, что по стандарту _языка_ ни int, ни даже volatile int не являются atomic.


По стандарту sig_atomic_t в любом случае будет atomic.

Помнишь из этой ветки:
http://www.rsdn.org/forum/flame.comp/7460799.1

Мякотка в том, что тебе никто не запрещает вызывать тот хенлдер сигнала ручками из другого потока.

Симметричная мякотка в том, что в многопроцессорной системе обработчик прерывания может быть вызыван из другого потока (из основного), а не из того, в котором ты осуществляешь оперироавние с переменной типа sig_atomic_t.

А будет ли этот typedef на short, int, long — лично мне до фени.

Но если уже спорить ради спора, я бы запросто поставил ящик коньяка на то, что в 99,9% всех реализаций это будет int. ))
Отредактировано 04.06.2019 7:10 vdimas . Предыдущая версия . Еще …
Отредактировано 04.06.2019 7:05 vdimas . Предыдущая версия .
Отредактировано 04.06.2019 7:04 vdimas . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.