历史上的今天首页传统节日 24节气 企业成立时间 今日 问答
首页 > 问答 > HerbSutter提出的M&M规则在C++多线程编程中如何解决mutable与mutex的耦合问题?

HerbSutter提出的M&M规则在C++多线程编程中如何解决mutable与mutex的耦合问题?

蜂蜜柚子茶

问题更新日期:2025-07-12 13:43:57

问题描述

疑问句补充在C++多线程场景中,mutable成员变量与互斥锁(mutex)的
精选答案
最佳答案

疑问句补充
在C++多线程场景中,mutable成员变量与互斥锁(mutex)的耦合问题为何难以避免?HerbSutter的M&M规则如何通过设计模式打破这种耦合,同时保障线程安全?

核心问题解析

问题维度传统方法缺陷M&M规则解决方案
锁粒度全局锁导致性能瓶颈按成员变量粒度分配锁(细粒度锁定)
mutable变量const函数中修改mutable变量时无法加锁强制为每个mutable变量绑定独立mutex
代码可维护性锁与成员变量逻辑分散将mutex声明为成员变量,与对应数据绑定

M&M规则实现原理

  1. 成员变量与互斥锁一一对应
    每个可变成员变量(包括

    plaintext
    复制
    mutable
    类型)必须拥有一个专属的
    plaintext
    复制
    std::mutex
    。例如:

    cpp
    复制
    classMyClass{ mutablestd::mutexcacheMutex;//mutablemutex对应mutable成员 mutableintcachedValue; std::mutexdataMutex;//普通mutex对应普通成员 intnormalData; };
  2. 强制锁的生命周期管理
    通过

    plaintext
    复制
    std::lock_guard
    plaintext
    复制
    std::unique_lock
    确保锁的自动释放,避免手动解锁的遗漏风险:
    plaintext
    复制
    cpp intMyClass::getCache()const{ std::lock_guardlock(cacheMutex);//RAII机制管理锁 returncachedValue; }

    plaintext
    复制
    undefined
  3. const成员函数的特殊处理

    plaintext
    复制
    mutable
    成员的访问需在
    plaintext
    复制
    const
    函数中显式加锁,确保线程安全的同时保持接口的
    plaintext
    复制
    const
    正确性。

优势与适用场景

  • 优势

    • 解耦逻辑:锁与数据绑定,减少跨成员变量的锁竞争。
    • 代码清晰:通过成员变量名直接推导锁名(如
      plaintext
      复制
      dataMutex
      对应
      plaintext
      复制
      normalData
      )。
    • 可扩展性:新增成员变量时,自动触发锁的添加,降低维护成本。
  • 适用场景

    • 高并发场景下的缓存更新(如
      plaintext
      复制
      mutable
      缓存变量)。
    • 需要频繁读写但逻辑独立的成员变量(如日志记录、统计计数器)。

常见误区与解决方案

误区解决方案
共享全局锁拆分锁粒度,为每个成员变量分配独立mutex
忘记为mutable变量加锁编译器强制要求
plaintext
复制
const
函数中对mutable成员加锁
死锁风险使用
plaintext
复制
std::lock
plaintext
复制
std::scoped_lock
管理多锁顺序

通过M&M规则,开发者能够系统性地将线程安全责任分配到每个成员变量,而非依赖全局锁或事后补丁,从而显著降低多线程编程的复杂度。

相关文章更多

    该合作原则的提出是否受到当时国际政治格局的影响?例如美国战略防御计划? [ 2025-07-12 13:23:39]
    在国际关系领域,一项合作原则的提出往往与当时的国际

    为何说张之洞提出的“中体西用”思想是洋务派改革的理论基石? [ 2025-07-12 00:14:30]
    “中体西用”即“中学为体,西学为用”,是19世纪60年代以后洋务

    网景公司和太阳公司在该案中提出了哪些关键指控? [ 2025-07-11 23:39:14]
    在相关案件中,网景公司和太阳公司提出的关键指控涉及多方面。网

    日本提出的“共同反共”条款为何成为蒋介石拒绝的关键因素之一? [ 2025-07-11 18:27:30]
    20世纪30年代中日谈判中,日方试图以反共名义干涉中国内政,蒋出于主权与

    毛泽东在何时首次提出过渡时期总路线,其核心内容是什么? [ 2025-07-11 13:13:28]
    毛泽东于1953年正式提出过渡时期总路线,核心是推动社会主义工业化与三

    当事人收到行政处罚告知书后,应在几日内提出听证申请? [ 2025-07-11 10:39:49]
    逾期未申请会直接失去听证权利吗?行政机关告知期限与实际操作是否存在差异?根据《中华

    蒄缇雅如何通过“服务型销售”模式实现品牌差异化?其提出的“民族养生品牌”定位在实际运营中如何体现? [ 2025-07-11 05:23:35]
    蒄缇雅能否凭借“服务型销售”模式真正在市场中打造出独特的品牌差异化?“民族养生品牌”定位又

    该报告在促进美中战略理解方面提出了哪些具体实施路径? [ 2025-07-11 05:03:34]
    在促进美中战略理解方面,报告或许会从多个维度提出实施路径,以推动双方更好地

    华华提出的乘用车物流运输规划模型在实际应用中面临哪些挑战? [ 2025-07-11 03:42:14]
    华华提出的乘用车物流运输规划模型在实际应用中究竟面临着哪些挑战呢?交通状况复杂多变现实中的

    娄义华对直播带货乱象提出了哪些监管建议? [ 2025-07-11 03:05:23]
    娄义华究竟对直播带货乱象提出了哪些监管建议呢?以下为大家介绍:序号建议内容1加强平台审核责任,平台要

    加入WTO后,大会提出的女性企业家创新发展路径是什么? [ 2025-07-11 01:47:30]
    中国加入WTO后,女性企业家群体通过政策引导与市场机制结合,逐

    曼彻斯特、利物浦等地商会在战前向政府提出了哪些诉求? [ 2025-07-10 17:06:24]
    19世纪中期,英国工业城市商会为维护贸易利益,多次向政府提

    DRAC2022挑战赛针对糖尿病视网膜病变分析提出了哪些具体任务? [ 2025-07-10 13:32:04]
    DRAC2022挑战赛在糖尿病视网膜病变分析方面究竟提出了哪些具体任

    发展中国家对发达国家的气候提案提出了哪些质疑? [ 2025-07-09 21:59:26]
    发展中国家在应对气候变化的国际进程中,对发达国家提出的气候提案存

    何香凝临终前提出的特殊遗愿是什么?中共中央如何处理? [ 2025-07-09 20:24:26]
    何香凝是伟大的革命先驱、杰出的妇女运动领袖。1972年,她临终前提出与

    《中华人民共和国密码法》对蜜码技术的应用提出了哪些规范性要求? [ 2025-07-09 13:42:46]
    《中华人民共和国密码法》对蜜码技术的应用究竟提出了哪些规范性要求呢?

    固始县人民政府办公室在统筹协调各部门工作时,如何处理存在争议的事项并提出解决方案? [ 2025-07-09 13:09:32]
    如何在保障部门独立性的同时实现高效协同?一、争议事项处理机制争议类型协调方式法律依据

    日本在联合声明次日提出“协助航行安全”的真实意图是什么? [ 2025-07-09 10:05:31]
    日本政府于联合声明发布后提出加强“航行安全”合作,表面是为维护地区稳定,实则可能试图扩大军事

    彭德怀在《解放军报》的筹备过程中提出了哪些关键意见? [ 2025-07-09 02:39:26]
    《解放军报》筹备意义重大,彭德怀元帅提出的关键意见对其日后

    法国提出租借广州湾的历史背景与甲午战争有何关联? [ 2025-07-09 02:04:13]
    法国提出租借广州湾这一事件有着复杂的历史背景,甲午战争在其中扮演了极为关键的角色,