C++_stdmutex和stdatomic

std::mutexstd::atomic

std::mutex 保护一个代码块 ,而 std::atomic 保护对单个变量的操作

std::mutex

std::mutex (互斥锁) 的作用是保护一个"临界区 (Critical Section)",也就是一段必须以原子方式执行的代码块。它确保在任何时刻,只有一个线程可以进入这段代码并执行其中的操作

  1. 锁定 (Locking) :一个线程在进入临界区前必须先获得锁 (lock)。如果锁已被其他线程持有,该线程将被阻塞 (Block),即进入休眠状态,直到锁被释放
  2. 高开销:线程阻塞和唤醒需要操作系统介入,涉及上下文切换,开销相对较大
  3. 保护复杂操作:非常适合保护需要多个步骤才能完成的操作,或者需要同时访问多个变量的场景

转账操作包含"A账户减钱"和"B账户加钱"两个步骤,这两个步骤必须作为一个整体完成,不可分割:

c++ 复制代码
#include <mutex>

class BankAccount {
private:
    std::mutex mtx_;
    double balance_ = 0;

public:
    void deposit(double amount) {
        std::lock_guard<std::mutex> lock(mtx_); // 自动加锁
        balance_ += amount;
    } // lock_guard析构时自动解锁

    void withdraw(double amount) {
        std::lock_guard<std::mutex> lock(mtx_);
        if (balance_ >= amount) {
            balance_ -= amount;
        }
    }
};

std::mutex 保护的是 balance_ 的整个读-改-写过程,确保其不被其他线程中断


std::atomic

std::atomic (原子类型) 的作用是为单个变量的读、写、修改 等操作提供原子性保证。它通常用于实现无锁 (Lock-free) 编程

  1. 原子指令 :它通常利用CPU提供的特殊原子指令(如x86上的 LOCK ADD)来完成操作。这意味着操作是不可中断的,一步到位
  2. 无阻塞:线程在执行原子操作时不会被操作系统挂起。如果多个线程同时尝试,它们会由CPU硬件来仲裁,但不会发生上下文切换
  3. 低开销:因为不涉及操作系统层面的锁定和线程调度,其性能远高于互斥锁

eg:多线程计数器

c++ 复制代码
#include <atomic>
#include <thread>
#include <vector>

std::atomic<int> counter(0);

void increment() {
    for (int i = 0; i < 10000; ++i) {
        counter++; // 这是一个原子的读-改-写操作
    }
}

int main() {
    std::vector<std::thread> threads;
    for (int i = 0; i < 10; ++i) {
        threads.emplace_back(increment);
    }
    for (auto& t : threads) {
        t.join();
    }
    // counter 的最终结果会是 100000
}

counter++ 这一行代码是原子性的,不会出现数据竞争

特性 std::mutex std::atomic
保护对象 代码块(一系列操作) 单个变量
机制 阻塞式锁定 通常为无锁原子指令
性能开销 较高 非常低
适用场景 保护复杂逻辑、多变量状态 简单的状态标记、计数器、指针交换等
相关推荐
讳疾忌医丶1 小时前
深度拆解 RocksDB 内核:基于 C++17 的 FIFO 调度状态机与温度阶梯自愈设计
java·c++·算法·架构
2401_868534782 小时前
OpenStack 架构全景:八个核心组件深度拆解
c++·需求分析
软件课代表CiCi2 小时前
运行库是什么?电脑缺运行库怎么办?c++运行库缺失修复全攻略
开发语言·c++·windows·电脑·dll修复·dll丢失·运行库
蒸蒸yyyyzwd3 小时前
从面经中学到的三件事
c++·笔记
时时三省3 小时前
【时时三省】计算机c语言二级考试选择题重点
c++
ThornArmor6 小时前
重铸1996|肉体渲染:关节的裂缝:分段模型积木拼装与未成熟的 RSP 矩阵骨骼动画形变
c语言·汇编·c++·python·硬件架构·游戏机
Elsa️7468 小时前
算法一周刷题总结
c++·算法
风合星语8 小时前
2026 机器人工程实例(五):让 Allegro Hand 在 MuJoCo 中完成接触抓取——抓取状态机、稳定抬升与受控释放
c++·python·机器人·仿真
小羊没烦恼!8 小时前
Memory 记忆设计讨论:Agent Memory 的数据模型可以怎么设计
java·开发语言·前端·c++·c#
welfare9628 小时前
新号别搞:内存管理+模板初阶+STL简介
开发语言·c++