c++concurrency in actionのSpinLockMutex

972 ワード

次のようになります.
class spinlock_mutex
{
	std::atomic_flag flag;
public:
	spinlock_mutex() :
		flag(ATOMIC_FLAG_INIT)
	{

	}
	void lock()
	{
		while (flag.test_and_set(std::memory_order_acquire));
	}
	void unlock()
	{
		flag.clear(std::memory_order_release);
	}
};

 
linux上でgcc 5.4コンパイルは問題なく、vs 2013/2017でコンパイルは通過できません.
error C2280: 'std::atomic_flag::atomic_flag(const std::atomic_flag &)': attempting to reference a deleted function.
最近この構造を使ってコンパイルできないことに気づいたのです.
次のように変更する必要があります.
 
#include   
class spinlock_mutex
{
	std::atomic_flag flag=ATOMIC_FLAG_INIT;
public:
	spinlock_mutex()
	{

	}
	void lock()
	{
		while (flag.test_and_set(std::memory_order_acquire));
	}
	void unlock()
	{
		flag.clear(std::memory_order_release);
	}
};

 
test_and_setのmemory_order、個人的にはstd::memory_order_acq_relの原因は、falseを読むと、後ろのread/writeが前に乱さないようにすれば、前のread/writeの乱順に関心がないからです.