C++经典案例

  1. per-thread的单例模式
//单例子模式,per-thread的单例模式
IPCThreadState* IPCThreadState::self() //IPCThreadState.cpp
{
    if (gHaveTLS.load(std::memory_order_acquire)) {
restart:
        const pthread_key_t k = gTLS;
        IPCThreadState* st = (IPCThreadState*)pthread_getspecific(k);
        if (st) return st;
        return new IPCThreadState;
    }

    // Racey, heuristic test for simultaneous shutdown.

    if (gShutdown.load(std::memory_order_relaxed)) {
        ALOGW("Calling IPCThreadState::self() during shutdown is dangerous, expect a crash.\n");
        return nullptr;
    }

    pthread_mutex_lock(&gTLSMutex);
    if (!gHaveTLS.load(std::memory_order_relaxed)) {
        int key_create_value = pthread_key_create(&gTLS, threadDestructor);
        if (key_create_value != 0) {
            pthread_mutex_unlock(&gTLSMutex);
            ALOGW("IPCThreadState::self() unable to create TLS key, expect a crash: %s\n",
                    strerror(key_create_value));
            return nullptr;
        }
        gHaveTLS.store(true, std::memory_order_release);
    }
    pthread_mutex_unlock(&gTLSMutex);
    goto restart;
}

Original: https://www.cnblogs.com/hellokitty2/p/16463356.html
Author: Hello-World3
Title: C++经典案例

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535482/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C++ 模板类相关问题

    1.模板类中的函数定义与实现必须全部写在头文件中 C++中每一个对象所占用的空间大小,是在编译的时候就确定的,在模板类没有真正的被使用之前,编译器是无法知道,模板类中使用模板类型的…

    C++ 2023年5月29日
    052
  • std::get<C++11多线程库~线程管理>(09):运行时决定线程数量

    1 #include 2 #include 3 #include 4 #include 5 #include 6 7 /* 8 * 话题1: 运行时决定线程的数量。 9 * 线程的…

    C++ 2023年5月29日
    040
  • C++ 内存池 — C++ Memory Pool

    这是我翻译的文章,来自 Code Project, 原文作者: DanDanger2000. 原文链接: http://www.codeproject.com/cpp/Memory…

    C++ 2023年5月29日
    083
  • c++构造和析构异常

    C++ 构造函数的异常是一个比较难缠的问题,很多时候,我们可能不去考虑这些问题,如果被问到,有人可能会说使用RAII管理资源。 但你真的考虑过如果构造函数失败了,到底会发生什么吗,…

    C++ 2023年5月29日
    050
  • 【C/C++】sscanf函数和正则表达式

    此文所有的实验都是基于下面的程序: char str[10]; for (int i = 0; i < 10; i++) str[i] = ‘!’; 执行完后str的值为 s…

    C++ 2023年5月29日
    049
  • C++设计模式(转载)

    C++设计模式之Adapter一、功能 将一个类的接口转换成客户希望的另外一个接口,解决两个已有接口之间不匹配的问题。Adapter模式使得原本由于接口不兼容而不能一起工作的那些类…

    C++ 2023年5月29日
    087
  • C++11 并发指南七(C++11 内存模型一:介绍)

    第六章主要介绍了 C++11 中的原子类型及其相关的API,原子类型的大多数 API 都需要程序员提供一个 std::memory_order(可译为内存序,访存顺序) 的枚举类型…

    C++ 2023年5月29日
    055
  • (筆記) 如何寫入binary file某個byte的值? (C/C++) (C)

    Abstract通常公司為了保護其智慧財產權,會自己定義檔案格式,其header區會定義每個byte各代表某項資訊,所以常常需要直接對binary檔的某byte直接進行寫入。 In…

    C++ 2023年5月29日
    049
  • C++深拷贝与浅拷贝

    对于普通类型的对象来说,它们之间的复制是很简单的,例如:int a=88;int b=a;而类对象与普通对象不同,类对象内部结构一般较为复杂,存在各种成员变量。下面看一个类对象拷贝…

    C++ 2023年5月29日
    041
  • C++ 内联函数解析(inline)

    inline是C++语言中的一个关键字,可以用于程序中定义内联函数,inline的引进使内联函数的定义更加简单。说到内联函数,这里给出比较常见的定义,内联函数是C++中的一种特殊函…

    C++ 2023年5月29日
    046
  • [C++] 浅拷贝和深拷贝

    浅拷贝只是简单的值拷贝; 深拷贝需要重新分配空间。 系统默认的拷贝构造函数属于浅拷贝。 输出结果为: HelloHelloWorldWorld 为什么修改对象 m 的值,对象 n …

    C++ 2023年5月29日
    069
  • C++ lambda 用法

    为什么要使用lambda 就地匿名的定义一个目标函数或者函数对象,不需要额外的再写一个命名函数或者函数对象,以更直接的方式去写函数,可以调高程序的可读性和可维护性。 简洁:不要额外…

    C++ 2023年5月29日
    067
  • [UE4]虚幻引擎的C++环境安装

    一、一般使用VS2017开发 二、需要勾选”使用C++的游戏开发” posted on2019-03-08 17:02 一粒沙 阅读(2513 ) 评论()…

    C++ 2023年5月29日
    050
  • C++ 相关库

    C++ 相关库 说明 RapidJSONhttps://github.com/Tencent/rapidjson Original: https://www.cnblogs.com…

    C++ 2023年5月29日
    068
  • c和c++编译器之gcc和mingw

    三大编译器:gcc,llvm,clang 什么是gcc? gcc 官方网站:https://gcc.gnu.org GCC(GNU Compiler Collection,GNU编…

    C++ 2023年5月29日
    075
  • Xcode 导出C++项目在其他电脑执行

    先找到C++项目的可执行文件的位置 https://blog.csdn.net/qq_34759481/article/details/82700587 关于存储和加载文件的目录,…

    C++ 2023年5月29日
    060
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球