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

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

蜂蜜柚子茶

问题更新日期:2025-07-24 10:11:19

问题描述

疑问句补充在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-24 06:43:40]
    傅海棠在《中国崛起的奥秘-财富论》里究竟

    威尔逊总统在国会演说中提出的核心参战理由是什么? [ 2025-07-24 03:48:40]
    在1917年4月2日,威尔逊总统在国会发表演说,力主美国加入第一次世界大战

    古代希腊著名的哲学家,提出 “认识你自己” 的是谁? [ 2025-07-24 01:30:01]
    古代希腊著名的哲学家,提出 “认识你自己” 的是谁?具有什么影响?

    如何区分喻晓提出的明喻、隐喻与借喻在实际语言表达中的差异? [ 2025-07-23 18:49:12]
    在实际语言表达里,我们怎样才能清晰区分喻晓所提出的明喻、隐喻和借喻的差异呢?明喻特点

    国务院学位委员会对学位授予单位的质量保证提出了哪些要求? [ 2025-07-23 07:32:50]
    国务院学位委员会围绕学科建设、过程管理、监

    十六字诀与1931年提出的“十项任务”有何关联? [ 2025-07-23 05:19:45]
    十六字诀是“敌进我退,敌驻我扰,敌疲我打,敌退我追”

    余昌宇提出的“文气、墨气、大气、雅气”四气理论在其花鸟画中如何具体体现? [ 2025-07-23 02:07:20]
    这一理论如何在传统笔墨与当代审美之间找到平衡?余昌宇的“四气”体系是否突破了传统花鸟画的程式化框架

    古希腊著名的哲学家,提出 “理念论” 的是谁? [ 2025-07-22 15:30:02]
    古希腊著名的哲学家,提出 “理念论” 的是谁?其主要内容是什么?

    小良在生态旅游案例分析中提出了哪些资源保护的具体措施? [ 2025-07-22 12:10:18]
    小良在生态旅游案例分析中提出了哪些资源保护的具体措施呢?这些措施是如何在实际案例中发挥作用

    大陆漂移说提出的具体时间和场合是什么? [ 2025-07-22 10:39:00]
    大陆漂移说是解释地壳运动和海陆分布、演变的学说。该学说由德国气象学家、地球物理学家阿尔弗雷德·魏格

    习近平提出核安全命运共同体后,国际社会有哪些响应或合作案例? [ 2025-07-22 06:46:40]
    习近平在2014年荷兰海牙第三届核安全峰

    吴伟仁提出的深空探测“双百目标”对太阳系边际探索有何科学意义? [ 2025-07-22 06:05:25]
    这一目标如何推动人类对太阳系边缘的认知边界?科学意义解析1.验证太阳系形成理论通过探测太阳系

    1994年乌拉圭回合谈判结束后,中国为复关提出了哪些改进方案? [ 2025-07-21 23:21:15]
    1994年乌拉圭回合谈判落幕,中国针对复关(恢复关贸总协定缔约国地位

    宫脇咲良的粉丝为何对其在LESSERAFIM中的C位分配提出争议? [ 2025-07-21 23:12:41]
    C位分配是否反映了成员的实际贡献?争议焦点分析争议维度核心矛盾点粉丝诉求资历与活动

    中国何时加入该公约?加入时提出了哪些保留条款? [ 2025-07-21 20:18:16]
    由于不清楚具体所指公约,以下以《联合国国际

    叶和才提出的滨海盐土改良新途径具体包括哪些措施? [ 2025-07-21 10:17:39]
    叶和才在滨海盐土改良方面提出了一系列实用且有效的新途径,这

    如何理解沈鹏提出的“世间无物非草书”与“非的草书”艺术内涵的关系? [ 2025-07-21 06:23:40]
    这两个概念到底有着怎样微妙而深刻的内在联系呢?要理解它们之间

    会议纪要对低收入家庭奔小康提出了哪些支持政策? [ 2025-07-21 05:24:55]
    会议纪要旨在助力低收入家庭实现小康,可能会从多个维度出台支持政策,下

    在共同负责的调研工作中,小胡频繁提出新想法导致偏离重点,如何通过有效沟通既保留创新性又确保任务目标不偏移? [ 2025-07-21 02:29:36]
    在共同负责调研工作时,小胡不断提出新想法致使偏离重点,那怎样才能通过有

    孙中山提出的“同业划一工价”“参加国民革命”等口号具体包含哪些诉求? [ 2025-07-20 23:41:55]
    孙中山提出的“同业划一工价”与“参加国民革命”口号,反映了特定历史时期工人