美文网首页
modern c++(2)-局部静态变量线程安全

modern c++(2)-局部静态变量线程安全

作者: RC_HT | 来源:发表于2019-07-17 17:35 被阅读0次

局部静态变量

局部静态变量就是定义在函数内部的静态变量。它的初始化发生在该函数第一次被调用执行到局部静态变量定义语句时
利用这一点可以用来实现懒汉式(lazy)单例模式

static Singleton &getInstance() {
    static Singleton instance;
    return instance;
}

但在C++98/03标准中,这一代码并不是线程安全的,因为上述代码相当于编译器帮你生成了是否初始化的过程,只是没有考虑线程安全性。

static Singleton& instance()
{
    static bool initialized = false;
    static char buf[sizeof(Singleton)];

    if (!initialized) {
        initialized = true;
        new(&buf) Singleton();
    }

    return (*(reinterpret_cast<Singleton*>( &buf)));
}

线程安全

C++11改进了这一情况,保证了线程安全:

such a variable is initialized the first time control passes through its declaration; such a variable is considered initialized upon the completion of its initialization. If the initialization exits by throwing an exception, the initialization is not complete, so it will be tried again the next time control enters the declaration. If control enters the declaration concurrently while the variable is being initialized, the concurrent execution shall wait for completion of the initialization. If control re-enters the declaration recursively while the variable is being initialized, the behavior is undefined.

  • 若初始化抛出异常将继续保持未初始化状态
  • 若正在初始化,其它运行初始化语句线程将被阻塞
  • 若正在初始化的线程递归调用初始化语句行为未定义

相关文章

  • modern c++(2)-局部静态变量线程安全

    局部静态变量 局部静态变量就是定义在函数内部的静态变量。它的初始化发生在该函数第一次被调用执行到局部静态变量定义语...

  • C++面试考点总结

    static作用是什么?在C和C++中有何区别? static可以修饰局部变量(静态局部变量)、全局变量(静态全局...

  • TLS(线程本地存储)

    TLS是一种在多线程时使用的技术,它可以使你的全局变量、静态变量以及局部静态、静态成员变量成为线程独立的变量,即每...

  • JAVA高级开发-学习笔记(volatile关键字)

    一、变量分为哪几类 全局变量 = 属性(静态的、非静态的)局部变量 = 本地变量、参数 二、多线程间共享数据 全局...

  • 【高并发】面试官问我:为什么局部变量是线程安全的?

    写在前面 相信很多小伙伴都知道局部变量是线程安全的,那你知道为什么局部变量是线程安全的吗? 前言 多个线程同时访问...

  • C++ 单例模式

    本文介绍C++单例模式的集中实现方式,以及利弊 局部静态变量方式 上述代码通过局部静态成员single实现单例类,...

  • 单例模式 → 破坏 → 阻止破坏

    单例常用实现 懒汉 线程不安全 饿汉 基于static 线程安全a. 静态成员变量b. 静态块儿c. 静态内部类 ...

  • 变量

    局部变量 、成员变量、全局变量 全局变量 线程不安全 public class GlobalVarManager ...

  • Java中的三种变量

    三大变量分别是类变量(静态变量)、实例变量和局部变量(本地变量)。所有的局部变量都存储在线程的栈中,而所有的类变量...

  • Java笔记

    方法中的局部变量是肯定没有安全的问题的,除非你把局部变量用引用传值给多个子线程。 方法中的局部变量是属于每个线程栈...

网友评论

      本文标题:modern c++(2)-局部静态变量线程安全

      本文链接:https://www.haomeiwen.com/subject/ukkclctx.html