ARTICLE DETAIL

建站实战干货

来自一线的建站与推广经验沉淀,每一条都经过真实交付验证。

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

2026/10/1 12:28:38 拓冰建站 浏览量
C++锁机制与信号机制对比分析 前言在C中多线程编程的线程同步和通信主要依赖于锁机制和信号机制。一、锁机制锁用于控制对共享资源的访问防止多个线程同时修改数据导致竞态条件。互斥锁Mutex作用确保同一时间只有一个线程能访问共享资源。类型○ std::mutex基本互斥锁。○ std::recursive_mutex允许同一线程多次加锁解决递归调用中的锁问题。○ std::shared_mutexC17读写锁允许多个读线程或单个写线程访问。基本用法1234567#include mutexstd::mutex mtx;voidthread_func() {mtx.lock();// 访问共享资源mtx.unlock();}RAII包装器推荐使用避免手动解锁std::lock_guard自动在作用域内加锁和解锁。1234{std::lock_guardstd::mutex lock(mtx);// 自动加锁离开作用域自动解锁}std::unique_lock更灵活支持延迟加锁和手动控制。1234std::unique_lockstd::mutex lock(mtx, std::defer_lock);lock.lock();// 手动加锁// ...lock.unlock();// 可提前解锁读写锁Shared Mutex适用场景读多写少的情况提高并发性能。用法123456789101112#include shared_mutexstd::shared_mutex rw_mtx;// 读操作共享锁{std::shared_lockstd::shared_mutex lock(rw_mtx);// 多个读线程可同时访问}// 写操作独占锁{std::unique_lockstd::shared_mutex lock(rw_mtx);// 仅一个写线程可访问}死锁预防原则a. 按固定顺序加锁。b. 使用std::lock同时加多个锁避免死锁。123std::lock(mtx1, mtx2);// 原子性锁定多个互斥量std::lock_guardstd::mutex lock1(mtx1, std::adopt_lock);std::lock_guardstd::mutex lock2(mtx2, std::adopt_lock);二、信号机制条件变量核心操作等待Wait线程在条件不满足时挂起。 通知Notify条件满足时唤醒等待的线程。notify_one()唤醒一个等待线程。notify_all()唤醒所有等待线程。基本用法等待条件需配合互斥锁和谓词检查123456789101112131415std::mutex mtx;std::condition_variable cv;booldata_ready false;// 等待线程{std::unique_lockstd::mutex lock(mtx);cv.wait(lock, [] {returndata_ready; });// 防止虚假唤醒// 条件满足后执行操作}// 通知线程{std::lock_guardstd::mutex lock(mtx);data_ready true;cv.notify_one();// 或 notify_all()}避免虚假唤醒使用带有谓词检查的wait1cv.wait(lock, predicate);// 等价于 while (!predicate) cv.wait(lock);三、信号量SemaphoreC20 引入了std::counting_semaphore用于控制同时访问资源的线程数量。基本用法12345#include semaphorestd::counting_semaphore10 sem(3);// 最大计数10初始3sem.acquire();// 计数减1如果计数为0则阻塞// 访问资源sem.release();// 计数加1适用场景● 限制并发线程数如连接池。● 生产者-消费者模型中的缓冲区控制。四、锁与信号机制的对比到此这篇关于C锁机制与信号机制的文章就介绍到这了