В некоторых учебнике я видел реализацию таких спин блокировкиC++ приказывать
class spin_lock
{
atomic<unsigned int> m_spin ;
public:
spin_lock(): m_spin(0) {}
~spin_lock() { assert(m_spin.load(memory_order_relaxed) == 0);}
void lock()
{
unsigned int nCur;
do { nCur = 0; }
while (!m_spin.compare_exchange_weak(nCur, 1, memory_order_acquire));
}
void unlock()
{
m_spin.store(0, memory_order_release);
}
};
нам действительно нужно memory_order_acquire
/memory_order_release
теги для compare_exchange_weak
и store
операции соответственно делать? Или memory_order_relaxed
является достаточным в этом случае, поскольку нет синхронных отношений?
Обновление: Спасибо за объяснения! Я рассматривал spin_lock без контекста, в котором он используется.
«нет синхронизации» С отношением «Да, есть. Например: предположим, что spin_lock защищает общий ресурс, а поток A использует spin_lock.lock() для получения ресурса, тогда как поток B отпирает блокировку. Для предотвращения переупорядочения инструкций требуется порядок памяти. –
Я бы реализовал спин-блокировки с помощью ['atomic_flag'] (http://en.cppreference.com/w/cpp/atomic/atomic_flag), так как это единственный гарантированный переносимый без блокировки атомный тип. – Casey