Я наткнулся на тот простой Spinlock, который также работает с lock_guard для хранения соглашений RAII:
#include <atomic>
class SpinLock
{
private:
std::atomic_flag lck = ATOMIC_FLAG_INIT;
public:
inline SpinLock(){};
~SpinLock(){};
inline void lock(){
while (lck.test_and_set(std::memory_order_acquire))
{
}
}
inline void unlock()
{
lck.clear(std::memory_order_release);
}
};
Но это не компилируется.
Error 1 6 error C2664: 'std::atomic_flag::atomic_flag(const std::atomic_flag &)' : cannot convert argument 1 from 'int' to 'const std::atomic_flag &' ...\spinlock.h 1 ShortDB
Может кто-нибудь объяснить почему? Есть много примеров, которые делают то же самое. (например cplusplus.com)
Редактировать:
Макро-стрит от атомной VS2013:
// STRUCT atomic_flag
#define ATOMIC_FLAG_INIT {0}
Задача ещё не решена.