博客
关于我
C++11中静态局部变量初始化的线程安全性
阅读量:777 次
发布时间:2019-03-22

本文共 737 字,大约阅读时间需要 2 分钟。

C++11标准引入了对局部静态变量的线程安全性要求,使得实现线程安全的单例类变得非常简单。以下将深入分析这一实现方式,并探讨GCC如何在其实现中执行标准的要求。

局部静态变量的线程安全性机制在C++11标准中得到了详细描述。主要包括以下几个要点:

  • 变量在第一次访问时进行初始化,初始化完成后视为已完全;
  • 如在初始化过程中发生异常,视为未完成初始化,下一次访问时需重新初始化;
  • 当前线程在尝试初始化变量时,若其他线程正在初始化,当前线程会阻塞直到完成;
  • 若存在递归调用,则行为未定义。
  • 以一个例子来说明这个机制:

    class Foo {public:  static Foo *getInstance() {    static Foo s_instance;    return &s_instance;  private:    Foo() {}};

    该实现利用静态变量和C++11的线程支持机制,轻松获得线程安全的单例模式。

    GCC实现这一机制后,通过反汇编可以看到其如何配合C++运行时库(libsupc++)来实现线程安全。关键点包括:

  • 利用guard变量监控局部静态变量的初始化状态;
  • 使用__cxa_guard_acquire__cxa_guard_release来协调多个线程的行为。
  • 通过分析__cxa_guard_acquire函数的源码,可以看出它通过原子操作和futex系统调用确保线程安全。此外,当递归调用发生时,GCC在多线程环境下会导致死锁,而在单线程环境则会抛出异常,这正是C++11标准要求的处理方式。

    总的来说,线程安全的实现要求编程者严格遵守标准和语言的基础设施支持。如若需要自定义实现,建议借助现有库或框架,以避免复杂的底层管理工作。

    转载地址:http://crpwk.baihongyu.com/

    你可能感兴趣的文章
    Nginx访问控制_登陆权限的控制(http_auth_basic_module)
    查看>>
    nginx负载均衡器处理session共享的几种方法(转)
    查看>>
    nginx负载均衡的5种策略(转载)
    查看>>
    nginx负载均衡的五种算法
    查看>>
    Nginx运维与实战(二)-Https配置
    查看>>
    Nginx配置ssl实现https
    查看>>
    Nginx配置TCP代理指南
    查看>>
    Nginx配置——不记录指定文件类型日志
    查看>>
    Nginx配置代理解决本地html进行ajax请求接口跨域问题
    查看>>
    Nginx配置参数中文说明
    查看>>
    Nginx配置好ssl,但$_SERVER[‘HTTPS‘]取不到值
    查看>>
    Nginx配置实例-负载均衡实例:平均访问多台服务器
    查看>>
    Nifi同步过程中报错create_time字段找不到_实际目标表和源表中没有这个字段---大数据之Nifi工作笔记0066
    查看>>
    NIFI大数据进阶_离线同步MySql数据到HDFS_02_实际操作_splitjson处理器_puthdfs处理器_querydatabasetable处理器---大数据之Nifi工作笔记0030
    查看>>
    NIFI大数据进阶_连接与关系_设置数据流负载均衡_设置背压_设置展现弯曲_介绍以及实际操作---大数据之Nifi工作笔记0027
    查看>>
    NIO ByteBuffer实现原理
    查看>>
    Nio ByteBuffer组件读写指针切换原理与常用方法
    查看>>
    NIO Selector实现原理
    查看>>
    nio 中channel和buffer的基本使用
    查看>>
    NIO基于UDP协议的网络编程
    查看>>