Добрый вечер.
Пусть есть вот такой самописный мьютекс:
class TSpinlockMutex {
private:
std::atomic_flag LockFlag{ATOMIC_FLAG_INIT};
public:
void Lock() noexcept {
while( LockFlag.test_and_set(std::memory_order_acquire) )
;
}
void Unlock() noexcept {
LockFlag.clear(std::memory_order_release);
}
};
Правильно ли я понимаю, что при такой реализации его одновременно могут захватить несколько потоков,
т.к. если один установил значение c memory_order_acquire, то не факт, что остальные потоки это увидят.
А если в test_and_set указать флаг memory_order_acq_rel, то всё будет работать правильно.
Я прав?