2024/8/7小于 1 分钟
C++锁的实现
最近发现C++里面可以通过实现lock、unlock两个方法实现自定义锁,因此去看了下MSVC中std::lock_guard的C++11实现。lock_guard通过在构造函数中调用lock函数上锁、在unlock函数解锁。
_EXPORT_STD template <class _Mutex>
class _NODISCARD_LOCK lock_guard { // class with destructor that unlocks a mutex
public:
    using mutex_type = _Mutex;
    explicit lock_guard(_Mutex& _Mtx) : _MyMutex(_Mtx) { // construct and lock
        _MyMutex.lock();
    }
    lock_guard(_Mutex& _Mtx, adopt_lock_t) noexcept // strengthened
        : _MyMutex(_Mtx) {} // construct but don't lock
    ~lock_guard() noexcept {
        _MyMutex.unlock();
    }
    lock_guard(const lock_guard&)            = delete;
    lock_guard& operator=(const lock_guard&) = delete;
private:
    _Mutex& _MyMutex;
};1.自旋锁
获取不到资源时忙等待,适用于等待时间较短的情况,避免线程频繁切换。具体实现如下:
class SpinLock
{
private:
	std::atomic_flag flag;
public:
	SpinLock() :flag() {}
	void lock()
	{
		while (flag.test_and_set(std::memory_order_acquire));
	}
	void unlock()
	{
		flag.clear(std::memory_order_release);
	}
};2.互斥锁
获取不到资源时线程阻塞,适用于等待时间较长的情况
3.读写锁
允许多个线程同时读取共享资源,但在写入时会阻塞所有读者和其他写者。
