专栏首页C++核心准则原文翻译C++核心准则CP.111:如果真的需要好双重检查锁,使用惯用模式

C++核心准则CP.111:如果真的需要好双重检查锁,使用惯用模式

CP.111: Use a conventional pattern if you really need double-checked locking

CP.111:如果真的需要好双重检查锁,使用惯用模式

Reason(原因)

Double-checked locking is easy to mess up. If you really need to write your own double-checked locking, in spite of the rules CP.110: Do not write your own double-checked locking for initialization and CP.100: Don't use lock-free programming unless you absolutely have to, then do it in a conventional pattern.

双重检查锁容易把事情搞杂。如果你真的需要使用双重检查锁,而不管C++核心准则CP.100:不要使用无锁编程方式,除非绝对必要C++核心准则CP.110:不要自已为初始化编写双重检查锁定代码中的建议,那么在使用双重检查锁时遵循惯用模式。

The uses of the double-checked locking pattern that are not in violation of CP.110: Do not write your own double-checked locking for initialization arise when a non-thread-safe action is both hard and rare, and there exists a fast thread-safe test that can be used to guarantee that the action is not needed, but cannot be used to guarantee the converse.

当非线程安全动作很难发生,而且存在快速的线程安全测试可以用于保证不需要该动作,但是无法保证相反的情况,可以使用没有违背C++核心准则CP.110:不要自已为初始化编写双重检查锁定代码准则的双重检查锁模式。

Example, bad(反面示例)

The use of volatile does not make the first check thread-safe, see also CP.200: Use volatile only to talk to non-C++ memory

volatile的使用没有让第一个检查线程安全,参见CP.200:只在谈到非C++内存的时候使用volatile

mutex action_mutex;
volatile bool action_needed;

if (action_needed) {
    std::lock_guard<std::mutex> lock(action_mutex);
    if (action_needed) {
        take_action();
        action_needed = false;
    }
}
Example, good(范例)
mutex action_mutex;
atomic<bool> action_needed;

if (action_needed) {
    std::lock_guard<std::mutex> lock(action_mutex);
    if (action_needed) {
        take_action();
        action_needed = false;
    }
}

Fine-tuned memory order may be beneficial where acquire load is more efficient than sequentially-consistent load

当顺序以执行负载比需求负载更高效时,调整良好的内存顺序可能更有利

mutex action_mutex;
atomic<bool> action_needed;

if (action_needed.load(memory_order_acquire)) {
    lock_guard<std::mutex> lock(action_mutex);
    if (action_needed.load(memory_order_relaxed)) {
        take_action();
        action_needed.store(false, memory_order_release);
    }
}
Enforcement(实施建议)

??? Is it possible to detect the idiom?

有可能发现这种惯用法么?

原文链接https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#cp110-do-not-write-your-own-double-checked-locking-for-initialization

本文分享自微信公众号 - 面向对象思考(OOThinkingDalian),作者:面向对象思考

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2020-07-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • C++核心准则ES.24: 使用unique_ptr<T>管理指针

    Using std::unique_ptr is the simplest way to avoid leaks. It is reliable, it mak...

    面向对象思考
  • C++核心准则R.12:立即将显式分配的资源交给资源管理对象​

    If you don't, an exception or a return may lead to a leak.

    面向对象思考
  • C++核心准则CP.31:在线程之间以传值方式传递少量数据,而不是传递引用或指针

    Copying a small amount of data is cheaper to copy and access than to share it us...

    面向对象思考
  • 《微软飞行模拟》用AI还原全球15亿建筑,玩家发现bug:白金汉宫变成写字楼

    全球最大的仿真游戏《微软模拟飞行2020》本周正式上线。这款游戏还原了全球200万个城镇、15亿座建筑物和3.7万个机场,让玩家感受到真实世界里开飞机的感觉。

    量子位
  • 定义AI,麦卡锡、图灵、乔丹...我们听谁的?

    【AI科技大本营导读】关于如何定义人工智能我们似乎从来没有达成一致。一种观点是,机器现在还没有理解、推理能力,距离真正的人工智能相去甚远,人们只是在炒作一个看上...

    AI科技大本营
  • 芬兰面向全球提供完全免费的在线人工智能基础课程

    赫尔辛基大学希望芬兰人口中的百分之一,约54,000人可以参加今年的在线课程。迄今已有24,000人报名参加。

    AiTechYun
  • SHAI2018上海人工智能大会——「聚焦人工智能,助力创新创业」

    SHAI 2018上海人工智能大会暨第一届图像、视频处理与图像国际会议将于2018年8月15-17日在上海浦东软件园隆重举行。本次大会由上海市科技创业中心、上海...

    机器之心
  • 春节假期十大AI事件,看看你都错过了啥

    来看看在假期的吃喝、聚会、催婚与春节档之间你错过了啥AI大新闻,提提神,准备更好的工作状态吧。

    昱良
  • 春节假期十大AI事件,看看你都错过了啥

    来看看在假期的吃喝、聚会、催婚与春节档之间你错过了啥AI大新闻,提提神,准备更好的工作状态吧。

    量子位
  • PHP函数之日期时间函数date()详解

    format 必需。规定时间戳的格式。 timestamp 可选。规定时间戳。默认是当前的日期和时间。

    华创信息技术

扫码关注云+社区

领取腾讯云代金券