新闻详情

新闻详情

首页 / 资讯中心 / 详情

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

发布时间:2026/10/1 12:28:36来源:尧图网络
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锁机制与信号机制的文章就介绍到这了
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Node.js 错误处理实战:区分操作性错误与程序员错误(nodebestpractices 实践指南) 2026/10/2 0:07:37

Node.js 错误处理实战:区分操作性错误与程序员错误(nodebestpractices 实践指南)

文档教程后端 【免费下载链接】nodebestpractices ✅ The Node.js best practices list (July 2026) 项目地址: https://gitcode.com/GitHub_Trending/no/nodebestpractices 点击查看 免费下载 在 Node.js 应用中,错误并非一概而论:操作性错…

阅读更多 →
wifit3 RX回调机制解析:WEP/WPS状态机如何绕开UI轮询实现低延迟抓包 2026/10/2 0:07:37

wifit3 RX回调机制解析:WEP/WPS状态机如何绕开UI轮询实现低延迟抓包

wifit3 RX回调机制解析:WEP/WPS状态机如何绕开UI轮询实现低延迟抓包 【免费下载链接】wifit3 Wifite but USB-only & cross-platform. 项目地址: https://gitcode.com/GitHub_Trending/wi/wifit3 wifit3 是一款跨平台的纯 Python Wi-Fi 安全审计工具&…

阅读更多 →
根域名与www域名301重定向:5种服务器/CDN/代码配置方案 2026/10/2 0:07:37

根域名与www域名301重定向:5种服务器/CDN/代码配置方案

很多站长在建站初期,都会有这样一个疑问:用户访问example.com和www.example.com到底该不该统一?要不要做301重定向?怎么做才最稳妥?这个问题从我做运维第一天起就一直有人问,前前后后帮朋友和自己处理过不下…

阅读更多 →
Android五层系统架构全解析:从Linux内核到应用层 2026/10/2 0:07:30

Android五层系统架构全解析:从Linux内核到应用层

最初接触Android开发时,经常看到那张配色熟悉的分层架构图:最底下是Linux内核,往上依次是HAL、系统运行库、Java API框架和应用层。大多数教程一两句话就带过去了,当时觉得背下来就行了,直到真正排bug排到头皮发麻&…

阅读更多 →
Windows沙箱初始化失败?Codex安装报错排查与修复 2026/10/2 0:07:30

Windows沙箱初始化失败?Codex安装报错排查与修复

最近在一台 Windows 11 开发机上处理一个很典型的报错:安装完 Windows 版 Codex,进入它的初始设置向导,界面提示点击“继续完成 Windows 设置”,结果按钮点下去没跑完流程,直接弹窗说“Windows 沙箱初始化失败”。这个…

阅读更多 →
HER算法:用事后想象力破解强化学习稀疏奖励难题 2026/10/2 0:07:04

HER算法:用事后想象力破解强化学习稀疏奖励难题

说起“hindsight”这个词,了解强化学习的同行应该立刻会想到OpenAI在2018年提出的那个经典算法——Hindsight Experience Replay,简称HER。我在自己的机器人抓取项目里第一次把它跑通时,最大的感受不是“这算法真聪明”,而是“这算…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉