c++concurrency in actionのSpinLockMutex
972 ワード
次のようになります.
linux上でgcc 5.4コンパイルは問題なく、vs 2013/2017でコンパイルは通過できません.
error C2280: 'std::atomic_flag::atomic_flag(const std::atomic_flag &)': attempting to reference a deleted function.
最近この構造を使ってコンパイルできないことに気づいたのです.
次のように変更する必要があります.
test_and_setのmemory_order、個人的にはstd::memory_order_acq_relの原因は、falseを読むと、後ろのread/writeが前に乱さないようにすれば、前のread/writeの乱順に関心がないからです.
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の乱順に関心がないからです.