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