Libhybris之线程局部存储TLS实例(五)

news2024/11/19 7:23:24

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解线程局部存储TLS介绍.

2.线程局部存储TLS介绍

  • 在Linux,TLS(Thread Local Storage)是一种机制,用于为每个线程提供独立的内存空间,以存储线程特定的数据。线程局部存储(TLS,Thread Local Storage)是一种编程技术,用于在多线程环境中为每个线程分配独立的内存空间,以存储线程特定的数据。通过使用线程局部存储,每个线程可以拥有独立的变量副本,而不会互相干扰。TLS 提供了解决这些问题的方法。
    TLS 主要用于以下几个方面:

    1. 线程安全:在多线程环境下,每个线程需要独立地维护自己的数据,例如线程私有的全局变量、错误状态、线程局部变量等。通过使用线程局部存储,可以避免多个线程同时访问共享变量时产生的竞争条件和数据不一致性问题。
    1. 提高性能:线程局部存储可以提高多线程程序的性能,因为每个线程可以直接访问自己的数据,而不需要通过锁来保护共享变量的访问。这可以减少锁竞争和线程间的同步开销。
    1. 管理全局状态:某些情况下需要在线程间共享全局状态,但又需要保证线程安全。TLS 可以用来管理线程私有的全局状态,从而实现线程间共享全局状态的需求。
    1. 线程局部存储使得多线程程序能够更加高效和安全地处理线程间的数据隔离和共享问题。

3.两种方式来实现线程局部存储

    1. POSIX 线程库:在 POSIX 线程库中,可以使用 pthread 库提供的函数 pthread_key_create、pthread_setspecific 和 pthread_getspecific 来创建和管理线程局部存储。
    1. GCC 编译器内建函数:GCC 编译器提供了 __thread 关键字,用于声明线程局部变量。使用这个关键字声明的变量会为每个线程创建独立的副本。
  • 3.Linux 的 TLS 机制通常通过操作系统和编译器的协作来实现。在编译器层面,使用 __thread 关键字声明的变量会被编译成特定的指令,以实现线程局部存储。在操作系统层面,内核会负责分配和管理线程的 TLS 存储空间,以确保每个线程可以独立地访问自己的变量副本。

特别值得一提的是,TLS 在 Linux 下的实现一般涉及到与编译器和链接器的配合,因为在不同的架构和编译器下,TLS 的具体实现机制可能有所不同。

-4. Linux 中的 TLS 机制提供了一种有效的方式来管理线程局部存储,使得多线程程序能够更加高效地处理线程间的数据隔离和共享问题。

4.代码实例

1.通过pthread库实现线程局部存储

#include <iostream>
#include <pthread.h>

pthread_key_t key;
void* threadFunc(void* arg) {
    int* value = new int(42);
    // 将数据存储到线程局部存储中
    pthread_setspecific(key, value);
    // 从线程局部存储中取出数据
    std::cout << "Thread-local value: " << *((int*)pthread_getspecific(key)) << std::endl;
    return NULL;
}

int main() {
    // 创建线程局部存储的键
    pthread_key_create(&key, NULL);
    pthread_t thread1, thread2;
    // 创建线程
    pthread_create(&thread1, NULL, threadFunc, NULL);
    pthread_create(&thread2, NULL, threadFunc, NULL);
    // 等待线程结束
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    // 删除线程局部存储的键
    pthread_key_delete(key);
    return 0;
}

2. 通过__thread关键字实现线程局部存储

#include <iostream>

// 通过__thread关键字实现线程局部存储
__thread int tls_var = 42;

void* threadFunc(void* arg) {
    // 打印线程局部存储中的数据
    std::cout << "Thread-local value: " << tls_var << std::endl;
    return NULL;
}

int main() {
    pthread_t thread1, thread2;
    // 创建线程
    pthread_create(&thread1, NULL, threadFunc, NULL);
    pthread_create(&thread2, NULL, threadFunc, NULL);
    // 等待线程结束
    pthread_join(thread1, NULL);
    pthread_join(thread2, NULL);
    return 0;
}

3.通过C++11标准中的thread_local关键字实现线程局部存储

#include <iostream>
#include <thread>

thread_local int tls_var = 42;

void threadFunc() {
    // 打印线程局部存储中的数据
    std::cout << "Thread-local value: " << tls_var << std::endl;
}

int main() {
    // 创建线程
    std::thread thread1(threadFunc);
    std::thread thread2(threadFunc);
    // 等待线程结束
    thread1.join();
    thread2.join();
    return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1204574.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

二十三、W5100S/W5500+RP2040树莓派Pico<Web I/O 通过网页控制板载LED灯>

文章目录 1 前言2 简介2 .1 什么是Web&#xff1f;2.2 Web的优点2.3 Web数据交互原理2.4 Web应用场景 3 WIZnet以太网芯片4 HTTP网络设置示例概述以及使用4.1 流程图4.2 准备工作核心4.3 连接方式4.4 主要代码概述4.5 结果演示 5 注意事项6 相关链接 1 前言 Web只是一个静态的文…

电源基础元件

文章目录 电源基础元件理想电压源理想电流源受控电源 电源基础元件 理想电压源 定义 其两端电压总能保持定值或一定的时间函数&#xff0c;其值与流过它的电流i无关的元件叫理想电压源 理想电压源的电压、电流关系 1.电源两端电压由电源本身决定&#xff0c;与外电路无关&…

桶装水订水送水app有哪些功能?

桶装水订水送水app是一款专为送水工量身打造的提供送水服务的软件&#xff0c;在这里&#xff0c;送水人员将更好的在线发布一些送水信息&#xff0c;在线接单等功能&#xff0c;极大的提高了工作效率&#xff0c;方便了日常生活。 系统的商户端&#xff0c;专为送水工日常送水…

【计算机网络】VRRP协议理论和配置

目录 1、VRRP虚拟路由器冗余协议 1.1、协议作用 1.2、名词解释 1.3、简介 1.4、工作原理 1.5、应用实例 2、 VRRP配置 2.1、配置命令 2.2、拓扑与配置&#xff1a; 1、VRRP虚拟路由器冗余协议 1.1、协议作用 虚拟路由冗余协议(Virtual Router Redundancy Protocol&am…

2023nacos源码解读第2集——nacos-server的启动

nacos 是一个典型的server-client中间件&#xff0c;server这里安装最新的nacos-server 2.3.0-BETA版本 1.docker启动nacos-server 镜像详情参考nacos-docker项目的readme &#xff0c;很方便&#xff0c;但是官方提供的nacos-server镜像往往可能滞后&#xff0c;且不便于后续…

【Java 进阶篇】JQuery DOM操作:舞动网页的属性魔法

在前端的舞台上&#xff0c;属性操作是我们与HTML元素进行互动的关键步骤之一。而JQuery&#xff0c;这位前端开发的巫师&#xff0c;通过简洁而强大的语法&#xff0c;为我们提供了便捷的属性操作工具。在这篇博客中&#xff0c;我们将深入研究JQuery DOM操作中的属性操作&…

C语言--1,5,10人民币若干,现在需要18元,一共有多少种?

今天小编给大家分享一下穷举法的一道典型例题 一.题目描述 1,5,10人民币若干,现在需要18元,一共有多少种? 二.思路分析 总共有18块钱&#xff0c;设1元有x张&#xff0c;5元有y张&#xff0c;10元有z张&#xff0c;则有表达式&#xff1a;x5y10z18&#xff0c;穷举法最重要的…

Unity中雾效的实现方法二

文章目录 前言一、声明雾效所需要的内置变体二、在 v2f 中声明顶点传入片段中的雾效插值器三、 在顶点着色器中计算雾效采样四、在片元着色器中进行雾效颜色混合在这里插入图片描述 五、最终效果 前言 Unity中雾效的实现方法二&#xff0c;使用 Unity 自带的方法实现&#xff…

Spring IOC - BeanDefinition解析

1. BeanDefinition的属性 BeanDefinition作为接口定义了属性的get、set方法。这些属性基本定义在其直接实现类AbstractBeanDefinition中&#xff0c;各属性的含义如下表所示&#xff1a; 类型 名称 含义 常量 SCOPE_DEFAULT 默认作用域&#xff1a;单例模式 AUT…

4.CentOS7安装MySQL5.7

CentOS7安装MySQL5.7 2023-11-13 小柴你能看到嘛 哔哩哔哩视频地址 https://www.bilibili.com/video/BV1jz4y1A7LS/?vd_source9ba3044ce322000939a31117d762b441 一.解压 tar -xvf mysql-5.7.26-linux-glibc2.12-x86_64.tar.gz1.在/usr/local解压 tar -xvf mysql-5.7.44-…

22.构造一个关于员工信息的结构体数组,存储十个员工的信息

结构体问题。构造一个关于员工信息的结构体数组&#xff0c;存储十个员工的信息&#xff0c;包括员工工号&#xff0c;员工工资&#xff0c;员工所得税&#xff0c;员工实发工资。要求工号和工资由键盘输入&#xff0c;并计算出员工所得税&#xff08;所得税工资*0.2&#xff0…

微服务概览

单体架构 传统的软件应用为单体架构。尽管也是模块化逻辑&#xff0c;但是最终还是会打包并并部署为单体应用。最主要的原因是太复杂。并且应用扩展性低&#xff0c;可靠性也低。敏捷开发和部署变得无法完成。 治理办法&#xff1a;化繁为简&#xff0c;分而治之。 微服务起源…

JavaScript从入门到精通系列第三十六篇:详解JavaScript中的事件监听和事件响应

文章目录 一&#xff1a;什么叫事件 1&#xff1a;概念 2&#xff1a;处理这个事件 (一)&#xff1a;鼠标单机按钮 (二)&#xff1a;鼠标双机按钮 (三)&#xff1a;鼠标移动 3&#xff1a;写法弊端 4&#xff1a;Dom Event 二&#xff1a;监听事件 1&#xff1a;元素事…

SpringCloud微服务:服务拆分

不同的数据库之间&#xff0c;如何共同调用&#xff1f;接下来讲讲两个数据库之间如何交互 1、微服务需要根据业务模块拆分&#xff0c;做到单一职责,不要重复开发相同业务 2、微服务可以将业务暴露为接口&#xff0c;供其它微服务使用 3、不同微服务都应该有自己独立的数据库…

中断处理机制解析

要处理中断&#xff0c;需要有一个中断处理函数。定义如下&#xff1a; irqreturn_t (*irq_handler_t)(int irq, void * dev_id);/*** enum irqreturn* IRQ_NONE interrupt was not from this device or was not handled* IRQ_HANDLED interrupt was handled by this de…

Netty实现通信框架

一、LengthFieldBasedFrameDecoder的参数解释 1、LengthFieldBasedFrameDecoder的构造方法参数 看下最多参数的构造方法 /*** Creates a new instance.** param byteOrder* the {link ByteOrder} of the length field* param maxFrameLength* the maximum len…

Ubuntu中安装R语言环境并在jupyter kernel里面增加R kernel

❤️觉得内容不错的话&#xff0c;欢迎点赞收藏加关注&#x1f60a;&#x1f60a;&#x1f60a;&#xff0c;后续会继续输入更多优质内容❤️ &#x1f449;有问题欢迎大家加关注私戳或者评论&#xff08;包括但不限于NLP算法相关&#xff0c;linux学习相关&#xff0c;读研读博…

由浅入深学习统计学 -集中趋势的量度

由浅入深学习统计学 -集中趋势的量度 均值 &#xff08;通俗来说是平均数&#xff09; 计算公式 均值在对称数据中才有参考性。 异常数据会导致出现&#xff0c;向左偏移或者向右偏移 中位数 - &#xff08;也是属于平均数的一种&#xff09; 当偏移数据和异常数据使得均值产…