Гарантируют ли спинлокации порядок приобретения? - PullRequest
2 голосов
/ 25 апреля 2019

У меня есть простая реализация спин-блокировки, подобная этой:

class Spinlock{
  std::atomic_flag flag;
public:
  Spinlock(): flag(ATOMIC_FLAG_INIT) {}
  ~Spinlock() {}

  void lock(){
    while(flag.test_and_set(std::memory_order_acquire));
  }

  void unlock(){
    flag.clear(std::memory_order_release);
  }
};

Мой вопрос похож на этот на мьютексах, но для спин-блокировки:

  • Тема 1 вызывает блокировку ()
  • Перед тем, как Поток 1 вызовет unlock (), Поток 2 и 3 оба вызовут lock ().

Гарантируется ли, что поток 2 получит спинлок до потока 3?

Если нет, существуют ли какие-либо реализации блокировки, которые гарантируют порядок приобретения?

1 Ответ

7 голосов
/ 25 апреля 2019

Нет, очередей и упорядочений не существует, потому что обычные спин-блокировки - это просто повторяющиеся гонки; каждый раз, когда попытка получить неудачу, память не переносится на следующую попытку, она просто мчится и надеется победить. Поток 2 или 3 может получить его с примерно равной вероятностью, даже если поток 2 вращался вокруг него в течение минуты, а поток 3 - в течение микросекунды.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...