1. 程式人生 > 其它 >C++實現自旋鎖

C++實現自旋鎖

背景
程式碼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);
}


來自為知筆記(Wiz)