C++實現自旋鎖
阿新 • • 發佈:2021-07-01
背景
程式碼
來自為知筆記(Wiz)
程式碼
背景
互斥鎖(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)