Size: a a a

Compiler Development

2020 January 11

K

Kir in Compiler Development
Или порт STM в $язык
источник

BD

Berkus Decker in Compiler Development
Kir
Use Control.Concurrent.STM, это всё, что я могу посоветовать. И вопросов о синхронизации не будет.
Стм дороже по имплементации, и там таки будут эти rel/acq емнип
источник

K

Kir in Compiler Development
Ну тогда Си и lock-free
источник

BD

Berkus Decker in Compiler Development
Kir
Ну тогда Си и lock-free
Там тоже на них все сделано, на атомиках
источник

I

Ioann_V in Compiler Development
Berkus Decker
Он может прочитать и «после», суть в том что никакого до и после тут нет)
то есть, если мы делаем запись релизом 1цу в одном потоке, а затем, делаем чтение экваером туже переменную, мы можем прочесть 0?
источник

EM

Evgenii Moiseenko in Compiler Development
Ioann_V
то есть, если мы делаем запись релизом 1цу в одном потоке, а затем, делаем чтение экваером туже переменную, мы можем прочесть 0?
да
источник

AS

Aleksey Shipilev in Compiler Development
Давайте с начала:
Thread1: x = 1;
Thread2: r1 = x; // можно ли здесь увидеть 0?

Простой ответ: конечно, может. T2 выполняется "перед" T1 и всё тривиально. И это правильный ответ, но чрезмерно упрощённый: он подразумевает, что есть некоторая референсная система отсчёта, в которой а) определено "перед"; б) память работает последовательно в этой с.о. Это иллюзия глобальной упорядоченной памяти, глобального времени/порядка. Оно даёт вам слишком узкое понимание проблемы: даёт только подмножество возможных случаев.

Более широкий ответ: конечно, может. T2 может выполниться, и НЕ увидеть запись, не важно "до" или "после" него выполнился T1. У Т1 и T2 нет согласованного понимания о времени вообще. Эффекты распространяются как попало, и пока мы что-то не увидели, мы это не увидели. Собственно распространение частичных эффектов и несёт в себе некоторую информацию о "логическом" времени.
источник

K

Kir in Compiler Development
Aleksey Shipilev
Давайте с начала:
Thread1: x = 1;
Thread2: r1 = x; // можно ли здесь увидеть 0?

Простой ответ: конечно, может. T2 выполняется "перед" T1 и всё тривиально. И это правильный ответ, но чрезмерно упрощённый: он подразумевает, что есть некоторая референсная система отсчёта, в которой а) определено "перед"; б) память работает последовательно в этой с.о. Это иллюзия глобальной упорядоченной памяти, глобального времени/порядка. Оно даёт вам слишком узкое понимание проблемы: даёт только подмножество возможных случаев.

Более широкий ответ: конечно, может. T2 может выполниться, и НЕ увидеть запись, не важно "до" или "после" него выполнился T1. У Т1 и T2 нет согласованного понимания о времени вообще. Эффекты распространяются как попало, и пока мы что-то не увидели, мы это не увидели. Собственно распространение частичных эффектов и несёт в себе некоторую информацию о "логическом" времени.
Неглобальной памяти не делают, чтобы не решать в железе конфликты апдейтов кешей
источник

BD

Berkus Decker in Compiler Development
Ioann_V
то есть, если мы делаем запись релизом 1цу в одном потоке, а затем, делаем чтение экваером туже переменную, мы можем прочесть 0?
Он мог не видеть этот релиз, и аквайрить соотв ему было нечего.
источник

BD

Berkus Decker in Compiler Development
Kir
Неглобальной памяти не делают, чтобы не решать в железе конфликты апдейтов кешей
MESI тогда что
источник

AS

Aleksey Shipilev in Compiler Development
Каждый раз, когда вы используете в рассуждении "перед", "после", "затем", не включающее в себя наблюдаемые эффекты, вы пачкаете рассуждение интуитивным пониманием общего времени, и *это* путает все карты :)
источник

I

Ioann_V in Compiler Development
Aleksey Shipilev
Каждый раз, когда вы используете в рассуждении "перед", "после", "затем", не включающее в себя наблюдаемые эффекты, вы пачкаете рассуждение интуитивным пониманием общего времени, и *это* путает все карты :)
тогда, что делает seq cst?
источник

I

Ioann_V in Compiler Development
Как он позволяет получить этот глобальный порядок?
источник

A

Alex Ф-ф-фэils!🌠︙ in Compiler Development
EgorBo
и да, если что, C# на ios — full aot
На вин 3.1 тоже😄
источник

AS

Aleksey Shipilev in Compiler Development
seqcst делает все результаты такими, что они должны быть объяснены каким-нибудь глобальным порядком. Это достигается тяжёлыми переговорами между всеми участвующими процами. Замечу: "должны быть объяснены", а не "реально произошли в глобальном порядке", что отдельный майндфак. Для всего остального, кроме seqcst, такого не гарантируется, и попытки такое же поведение приписать другим режимам ведёт к подъёму и съезжанию крыши.
источник

BD

Berkus Decker in Compiler Development
Ioann_V
тогда, что делает seq cst?
А ты читал доку по атомикам из цппреференс?
источник

I

Ioann_V in Compiler Development
Я и Уильямса читал, вот от туда и пришел с вопросом.
источник

I

Ioann_V in Compiler Development
Ну и вот, с Мксимом общаюсь и тоже, путаюсь.
источник

BD

Berkus Decker in Compiler Development
Мне просто после 4-5 прочтений казалось что в общем все уже понятно просто по той доке.
источник

I

Ioann_V in Compiler Development
Berkus Decker
Мне просто после 4-5 прочтений казалось что в общем все уже понятно просто по той доке.
Ну, что я должен ответить на это. Я не понял, а сейчас кажется понял. Ну, не все умными рождаются :)
источник