Size: a a a

Rust — русскоговорящее сообществo

2020 November 29

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
А, в англиской вики там нет мьютексов, но есть скромная приписка, что на современных процессоров нужно memory fence ставить
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
И как эти shared int внутри устроены?
источник

𝕯𝖁

𝕯mitry 𝖁akulenko... in Rust — русскоговорящее сообществo
Mikail Bagishov
И мне очень интересно, как это вообще могло бы работать.
Если не используется inline asm, то единственный способ одному потоку увидеть действия другого - это атомарные доступы к памяти.
Не совсем без атомиков. Без "настоящих" атомиков. Любое сохранение данных в память - это атомарная операция. Вот этот момент и используется.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
red75prime
Спинлоки - это оптимизация, чтобы уменьшить количество сисколлов. Разве нет?
ХЗ. Мне через некоторое время стало лень читать код libpthread, но выглядит так, как будто он использует спинлоки. Согласен, что это звучит нереалистично.
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
𝕯mitry 𝖁akulenko
Не совсем без атомиков. Без "настоящих" атомиков. Любое сохранение данных в память - это атомарная операция. Вот этот момент и используется.
Сохранение данных в память это не атомарная операция?..
источник

𝕯𝖁

𝕯mitry 𝖁akulenko... in Rust — русскоговорящее сообществo
Я так и сказал
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
Ты сказал что атомарная
Но нет же, не атомарная
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
В общем случае для Acquire & Release нужен mfence
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Ну и модель памяти раста это тоже требует.
Мб конкретно на x86 это можно обойти, делая эти доступы на ассемблере, но как-то попахивает.
источник

𝕯𝖁

𝕯mitry 𝖁akulenko... in Rust — русскоговорящее сообществo
Emmanuel Goldstein
Ты сказал что атомарная
Но нет же, не атомарная
Это как? Ячейка одна, по определению запись в неё может осуществлять только один поток одновременно
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
𝕯mitry 𝖁akulenko
Это как? Ячейка одна, по определению запись в неё может осуществлять только один поток одновременно
у ячейки есть "клон" (потенциально) в кэше каждого из ядер
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
𝕯mitry 𝖁akulenko
Это как? Ячейка одна, по определению запись в неё может осуществлять только один поток одновременно
Даже внутри одного потока процессор может переставлять местами инструкции, осуществляющие запись
источник

EG

Emmanuel Goldstein in Rust — русскоговорящее сообществo
«Поток» это вообще весьма высокоуровневый концепт
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Ну и я хз что будет, если несколько ядер в своем кэше поменяют одну и ту же ячейку.
По идее в итоге все записи кроме последней будут отброшены.
источник

𝕯𝖁

𝕯mitry 𝖁akulenko... in Rust — русскоговорящее сообществo
Mikail Bagishov
у ячейки есть "клон" (потенциально) в кэше каждого из ядер
Да, но, при записи кеш в других ядрах сбрасывается. Сразу и чуть погодя, но всё-таки.
источник

𝕯𝖁

𝕯mitry 𝖁akulenko... in Rust — русскоговорящее сообществo
Это вообще-то от архитектуры процессора зависит
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
𝕯mitry 𝖁akulenko
Да, но, при записи кеш в других ядрах сбрасывается. Сразу и чуть погодя, но всё-таки.
Это ты сейчас про x86, arm или risc-v?
источник

MB

Mikail Bagishov in Rust — русскоговорящее сообществo
Если уж писать собственные примитивы в образовательных целях, то имхо это надо делать для архитектур со слабой памятью
источник

𝕯𝖁

𝕯mitry 𝖁akulenko... in Rust — русскоговорящее сообществo
Mikail Bagishov
Это ты сейчас про x86, arm или risc-v?
Это общие рассуждения. Вот и проверю )
источник

IB

Ivan Boldyrev in Rust — русскоговорящее сообществo
𝕯mitry 𝖁akulenko
Да, но, при записи кеш в других ядрах сбрасывается. Сразу и чуть погодя, но всё-таки.
Если чуть погодя, то ты уже отстрелил себе ногу.
источник