首页 > 编程语言 > 详细

C++实现自旋锁

时间:2021-07-02 01:03:20      阅读:31      评论:0      收藏:0      [点我收藏+]

toc

背景

互斥锁(mutex):

  • 加锁失败的线程会被阻塞,阻塞的线程不耗费CPU资源
  • 导致模式切换,使用互斥锁加锁会进入内核态,阻塞时还会引发调度,运行时进入用户态

自旋锁(spin lock):

  • 使用了忙等待,加锁失败的线程会一直重复尝试加锁,耗费CPU资源
  • 使用机器指令实现,不涉及模式切换,也不会引发调度

如果锁粒度比较小,等待锁开销比使用互斥锁开销小,建议使用自旋锁,反之,使用互斥锁

代码

此自旋锁过lock-free的std::atomic_flag实现

#ifndef _SPINLOCK_H_
#define _SPINLOCK_H_

#include <atomic>

class SpinLock final{
public:
    SpinLock();
    ~SpinLock();

    void lock();
    void unlock();


    SpinLock(const SpinLock& rhs) = delete;
    SpinLock(SpinLock&& rhs) = delete;
    SpinLock& operator=(const SpinLock& rhs) = delete;
    SpinLock& operator=(SpinLock&& rhs) = delete;

private:
    std::atomic_flag m_lock = ATOMIC_FLAG_INIT;
};

#endif // !_SPINLOCK_H_
#include "SpinLock.h"


SpinLock::SpinLock(){
}

SpinLock::~SpinLock(){
}

void SpinLock::lock(){
    while(m_lock.test_and_set(std::memory_order_acquire));
}

void SpinLock::unlock(){
    m_lock.clear(std::memory_order_release);
}




C++实现自旋锁

原文:https://www.cnblogs.com/Keeping-Fit/p/14961258.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!