概述
如下:
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上gcc5.4编译无问题,在vs2013/2017上编译不能通过:
error C2280: 'std::atomic_flag::atomic_flag(const std::atomic_flag &)': attempting to reference a deleted function。
是最近要用到这个结构才发现不能编译。
应该修改为:
#include <atomic>
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的原因是我们不关心前面的read/write的乱序,只要确保当读到false时,后面的read/write不要乱序到前面就好。
最后
以上就是眼睛大人生为你收集整理的c++ concurrency in action中的 SpinLockMutex的全部内容,希望文章能够帮你解决c++ concurrency in action中的 SpinLockMutex所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复