如下:
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++内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复