Прошу пояснений по синхронизации acquire-release
От: DTF  
Дата: 08.02.17 17:05
Оценка:
Добрый вечер.

Пусть есть вот такой самописный мьютекс:
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, то всё будет работать правильно.

Я прав?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.