【c++】锁机制:mutex与condition_variable说明及示例代码

锁机制说明

mutex

互斥锁
用于多线程下保护资源同一时刻只有一个线程读写

std::mutex 是C++标准库中提供的互斥锁(Mutex)类,用于实现多线程之间的互斥访问。
它提供了两个主要的操作:lock() 和 unlock()。
当一个线程调用 lock() 函数时,如果锁没有被其他线程持有,那么该线程将获得锁,
否则,它会被阻塞,直到锁被释放。而当一个线程调用 unlock() 函数时,它释放了之前获得的锁。

condition_variable

条件变量
用于多线程下同步操作:A->B->A->B

std::condition_variable 是C++标准库中提供的条件变量(Condition Variable)类。
条件变量是一种线程间的同步机制,
它允许一个线程在某个特定条件下等待,而其他线程可以在满足这个条件时通知等待的线程继续执行。

消费者生产者模式下加锁代码

std::mutex mutex_; // 定义互斥锁
std::condition_variable cond_; // 定义条件变量

void producer() {
   
   
    // 生产数据
    {
   
   
        std::unique_lock<std::mutex> lock(mutex_);
        // 生产数据
    } // 离开作用域时自动释放锁

    cond_.notify_one(); // 通知一个等待的消费者线程
}

void consumer() {
   
   
    std::unique_lock<std::mutex> lock(mutex_);
    cond_.wait(lock); // 等待条件变量通知,同时释放锁,当被通知后重新获取锁

    // 消费数据
}

为什么需要2个变量

  1. std::mutex(互斥锁):std::mutex 是用来保护共享资源的,确保在任意时刻只有一个线程能够访问共享资源。当一个线程需要修改共享资源时,它必须先锁住互斥锁,以保证没有其他线程同时修改该资源。在上述例子中,std::mutex 被用于保护共享数据的读写,防止多个线程同时修改数据导致的竞态条件。

  2. std::condition_variable(条件变量):std::condition_variable 提供了一种机制,使得一个线程可以在满足特定条件时等待,同时允许其他线程在条件满足时通知等待的线程继续执行。在上述例子中,std::condition_variable 被用于在线程之间建立通信。当一个线程在等待某个条件成立时,它会通过 std::condition_variable 的 wait() 函数主动放弃锁,并且进入等待状态。另外一个线程在某个时刻通过条件变量的 notify_one() 或 notify_all() 函数,通知等待的线程条件已经满足,可以继续执行。


c++11新特性 lock_guardunique_lock

lock_guard

在作用域内自动锁定和解锁
不需要手动管理锁的释放

使用场景:

  • 当需要在某个作用域内对某个资源进行互斥访问时,可以使用 std::lock_guard。因为它的生命周期和作用域相对较小,所以更加轻量

示例代码:

std
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值