У меня есть простая реализация спин-блокировки, подобная этой:
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?
Если нет, существуют ли какие-либо реализации блокировки, которые гарантируют порядок приобретения?