C 语言

关注公众号 jb51net

关闭
首页 > 软件编程 > C 语言 > C++锁机制与信号机制

C++锁机制与信号机制对比分析

作者:张新颜

文章介绍C++多线程编程中线程同步与通信的锁机制(互斥锁、读写锁及RAII封装)和信号机制(条件变量、信号量),并对比其在资源控制、并发限制和线程协调中的应用场景与优缺点,对C++锁机制与信号机制相关知识感兴趣的朋友一起看看吧

前言

在C++中,多线程编程的线程同步和通信主要依赖于锁机制和信号机制。

一、锁机制

锁用于控制对共享资源的访问,防止多个线程同时修改数据导致竞态条件。

基本用法

#include <mutex>
std::mutex mtx;
void thread_func() {
    mtx.lock();
    // 访问共享资源
    mtx.unlock();
}

RAII包装器(推荐使用,避免手动解锁):
std::lock_guard:自动在作用域内加锁和解锁。

{
    std::lock_guard<std::mutex> lock(mtx);
    // 自动加锁,离开作用域自动解锁
}

std::unique_lock:更灵活,支持延迟加锁和手动控制。

std::unique_lock<std::mutex> lock(mtx, std::defer_lock);
lock.lock(); // 手动加锁
// ...
lock.unlock(); // 可提前解锁
#include <shared_mutex>
std::shared_mutex rw_mtx;
// 读操作(共享锁)
{
    std::shared_lock<std::shared_mutex> lock(rw_mtx);
    // 多个读线程可同时访问
}
// 写操作(独占锁)
{
    std::unique_lock<std::shared_mutex> lock(rw_mtx);
    // 仅一个写线程可访问
}
std::lock(mtx1, mtx2); // 原子性锁定多个互斥量
std::lock_guard<std::mutex> lock1(mtx1, std::adopt_lock);
std::lock_guard<std::mutex> lock2(mtx2, std::adopt_lock);

二、信号机制(条件变量)

std::mutex mtx;
std::condition_variable cv;
bool data_ready = false;
// 等待线程
{
    std::unique_lock<std::mutex> lock(mtx);
    cv.wait(lock, [] { return data_ready; }); // 防止虚假唤醒
    // 条件满足后执行操作
}
// 通知线程
{
    std::lock_guard<std::mutex> lock(mtx);
    data_ready = true;
    cv.notify_one(); // 或 notify_all()
}
cv.wait(lock, predicate); // 等价于 while (!predicate) cv.wait(lock);

三、信号量(Semaphore)

C++20 引入了std::counting_semaphore,用于控制同时访问资源的线程数量。

#include <semaphore>
std::counting_semaphore<10> sem(3); // 最大计数10,初始3
sem.acquire(); // 计数减1(如果计数为0则阻塞)
// 访问资源
sem.release(); // 计数加1

四、锁与信号机制的对比

到此这篇关于C++锁机制与信号机制的文章就介绍到这了,更多相关C++锁机制与信号机制内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文