C++ 中的几种锁机制整理

1. 互斥锁(std::mutex

✅ 简介

  • 最常用的线程同步工具。
  • 保证同一时间只能有一个线程访问临界区。

✅ 使用方式

#include <mutex>

std::mutex mtx;

void safeFunction() {
    std::lock_guard<std::mutex> lock(mtx);
    // 临界区代码
}

✅ 优点

  • 简单易用。
  • 可配合 std::lock_guardstd::unique_lock 自动释放锁。

❌ 缺点

  • 遇到锁竞争时,线程会挂起,涉及上下文切换,代价较高。

2. 自旋锁(Spinlock)

✅ 简介

  • 忙等待方式的锁,线程会在获取不到锁时不断循环尝试。
  • 适合临界区执行时间非常短的场景。

✅ 简易实现(非标准库提供)

#include <atomic>

class Spinlock {
private:
    std::atomic_flag flag = ATOMIC_FLAG_INIT;
public:
    void lock() {
        while (flag.test_and_set(std::memory_order_acquire)); // 自旋
    }
    void unlock() {
        flag.clear(std::memory_order_release);
    }
};

✅ 优点

  • 避免线程上下文切换,性能好于互斥锁(在锁竞争低、持有时间短的场景下)。

❌ 缺点

  • 占用 CPU 忙等,竞争严重时效率低。

3. 读写锁(std::shared_mutex

✅ 简介

  • 允许多个线程并发读,但写操作是独占的。
  • C++17 起引入 std::shared_mutexstd::shared_lock

✅ 示例

#include <shared_mutex>

std::shared_mutex rw_mutex;

void reader() {
    std::shared_lock<std::shared_mutex> lock(rw_mutex);
    // 只读操作
}

void writer() {
    std::unique_lock<std::shared_mutex> lock(rw_mutex);
    // 写操作
}

✅ 优点

  • 提高读操作并发性,减少读之间的阻塞。

❌ 缺点

  • 写操作依旧是阻塞的;读多写少的场景最适合。

4. 原子锁(基于 std::atomic

✅ 简介

  • 利用原子变量实现无锁同步(lock-free)。
  • 适合轻量级同步,比如计数器、自增等。

✅ 示例

#include <atomic>

std::atomic<int> counter = 0;

void increment() {
    counter.fetch_add(1, std::memory_order_relaxed);
}

✅ 优点

  • 极高性能;无锁竞争时几乎无代价。

❌ 缺点

  • 仅适用于非常简单的场景,复杂逻辑使用困难。
  • 易于出错;难以实现复杂的同步逻辑。

🔚 总结对比

锁类型是否阻塞性能适用场景是否标准库支持
互斥锁通用✅ C++11
自旋锁高(短时)临界区极短,高性能要求❌ 手动实现
读写锁读非阻塞读多写少场景✅ C++17
原子锁极高简单同步(计数器等)✅ C++11
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值