Задать вопрос
Eugene-Usachev
@Eugene-Usachev

Какой atomic::Ordering нужен в этих ситуациях?

Хочу убедиться, что правильно понимаю порядки, поэтому спрашиваю ваше мнение о нескольких ситуациях ниже:

1 - Once. Предположим, что надо написать Once только с двумя значениями (WasNotCalled = 0, WasCalled = 1). Для метод call может использовать swap и вернуть предыдущее значение. Но какой порядок нужно использовать в этом swap?

2 - SmartMutex. Предположим, что у нас есть очередь ожидающих задач. Тогда мы можем записать длину этого списка в SmartMutex. Если она равна -1 мы можем захватить блокировку. Если она равна 0, мы можем подождать пару спинов и попробовать снова. Если она больше 0, мы можем только встать в очередь.
Соответственно, нужно написать 2 метода: первый пробует взять лок, но не встаёт в очередь. То есть он должен сделать CAS и посмотреть на вернувшееся значение (если > 0 вернуть None). Какие порядки нужны этому CAS?
Второй метод увеличивает счётчик на один и встаёт в очередь, если предыдущее значение не -1, иначе возвращает блокировку. Какой порядок нужно использовать тут?
  • Вопрос задан
  • 43 просмотра
Подписаться 2 Простой Комментировать
Пригласить эксперта
Ответы на вопрос 1
jcmvbkbc
@jcmvbkbc
"I'm here to consult you" © Dogbert
Я ничего не знаю про rust, но это же вопрос про memory model, а эта тема уже обсосана C и С++. Например: eel.is/c++draft/atomics.order Самый строгий вариант ордеринга (sequential consistency) будет работать корректно всегда, и если вопрос не стоит как "насколько его можно ослабить", то разумно использовать его. Кроме того, для CAS это же единственная возможная опция, наксколько мне известно.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы