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

简介: 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;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Redis应用之二分布式锁

一、前言 前一篇 Redis应用之一自增编号 我们主要介绍了使用INCR命令来生成不重复的编号&#xff0c;今天我们来了解Redis另外一个命令SET NX的用途&#xff0c;对于单体应用我们可以简单使用像synchronized这样的关键字来给代码块加锁&#xff0c;但对于分布式应用要实现锁机…

select在标准输出和套接字上进行监控

selectServerInTCPIPbook.c的内容如下&#xff1a; #include <stdio.h> #include <stdlib.h> #include <string.h> #include <unistd.h> #include <arpa/inet.h> #include <sys/socket.h> #include <sys/time.h> #include <sys/…

kubernetes--Pod进阶

目录 一、资源限制&#xff1a; 1. 资源限制的两种规范&#xff1a; 2. Pod 和 容器 的资源请求和限制&#xff1a; 3. CPU 资源单位&#xff1a; 4. 内存资源单位 &#xff1a; 5. 资源限制示例&#xff1a; 二、健康检查&#xff1a;探针&#xff08;Probe&#xff09; 1. 探…

5. HTML常用标签

5.1 标签语义 学习标签是有技巧的&#xff0c;重点是记住每个标签的语义。简单理解就是指标签的含义。即这个标签是用来干嘛的。 根据标签的语义&#xff0c;在合适的地方给一个最为合理的标签。可以让页面结构给清晰。 5.2 标题标签 <h1>-<h6>(重要) HTML提供了…

【cfeng-work】架构演进和漫谈

架构漫谈和入门 内容管理 intro分层架构MVC模式分层架构大数据时代的复杂架构 前端架构后端架构运维端架构持续演进变化 本文主要是自己接触架构的一些输出漫谈 cfeng 在work中某次负责了后端一个服务的上线&#xff0c;多个模块一起上&#xff0c;结果上线失败&#xff0c;幸运…

Mysql 和 Redis 数据如何保持一致

先阐明一下Mysql和Redis的关系&#xff1a;Mysql是数据库&#xff0c;用来持久化数据&#xff0c;一定程度上保证数据的可靠性&#xff1b;Redis是用来当缓存&#xff0c;用来提升数据访问的性能。 关于如何保证Mysql和Redis中的数据一致&#xff08;即缓存一致性问题&#xf…

Python实现WOA智能鲸鱼优化算法优化卷积神经网络回归模型(CNN回归算法)项目实战

说明&#xff1a;这是一个机器学习实战项目&#xff08;附带数据代码文档视频讲解&#xff09;&#xff0c;如需数据代码文档视频讲解可以直接到文章最后获取。 1.项目背景 鲸鱼优化算法 (whale optimization algorithm,WOA)是 2016 年由澳大利亚格里菲斯大学的Mirjalili 等提…

适用于WPF的设计模式

适用于WPF的设计模式 讨论“XAML能不能写逻辑代码”这个问题。我发现这是个有歧义的问题。这个问题可以有两种意思&#xff1a; XAML能不能用来写逻辑代码&#xff1f; XAML文件里能不能包含逻辑代码&#xff1f; 对于第一种意思——XAML是一种声明性语言&#xff0c;就是用来…

Adobe家里那点事儿~~~

今天&#xff0c;我们来谈谈关于Adobe全家桶中Photoshop的故事。 Adobe Photoshop&#xff0c;简称PS。其定位是一款图像处理软件。他主要处理以像素所构成的数字图像。也就是说我们常见的非矢量图片。 Photoshop的专长在于图像处理&#xff0c;而不是图形的创作。他是对已有的…

项目应用多数据源动态切换(动态切换数据库连接)

文章目录 前言准备阶段具体配置功能展示注解方式切换数据源代码方式切换数据源优化方式 动态添加删除数据源事务问题参考文章 前言 最近公司的权限项目要实现多租户的功能&#xff0c;于是就要做数据隔离以确保每个租户的数据的安全性&#xff0c;但是项目中也要动态的提供能够…

动态修改hosts

前言 因工作需要频繁变更hosts&#xff0c; 故须自己实现一个动态管理器&#xff0c; 市面上其实已经有了类似的软件&#xff0c;比如switchhosts!但因为不好集成其他功能&#xff08;如远程连接KVM&#xff09;&#xff0c;所以还是决定自己开发一套。 原理 使用之前强烈建…

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

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

Netty实现通信框架

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

4面字节跳动拿到2-2Offer,入职就是30K16薪,全靠这份PDF

前言 当你开始开始去跳槽面试的时候&#xff0c;明明只是一份15K的工作&#xff0c;却问你会不会多线程&#xff0c;懂不懂高并发&#xff0c;火箭造得让你猝及不防&#xff0c;结果就是凉凉&#xff1b;现如今市场&#xff0c;多线程、高并发编程、分布式、负载均衡、集群等可…

ZYNQ实验--Petalinux--Linux C 编程入门

Linux C 编程入门 在 Windows 下我们可以使用各种各样的 IDE 进行编程&#xff0c;比如强大的 Visual Studio。Ubuntu 下也有一些可以进行编程的工具&#xff0c;但是大多都只是编辑器&#xff0c;也就是只能进行代码编辑&#xff0c;如果要编译的话就需要用到 GCC 编译器&…

【数据结构】堆(Heap):堆的实现、堆排序

目录 堆的概念及结构 ​编辑 堆的实现 实现堆的接口&#xff1a; 堆的初始化&#xff1a; 堆的打印&#xff1a; 堆的销毁&#xff1a; 获取最顶的根数据&#xff1a; 交换&#xff1a; 堆的插入&#xff1a;&#xff08;插入最后&#xff09; 向上调整&#xff1a;&#xff0…

网络和Linux网络_1(网络基础)网络概念+协议概念+网络通信原理

目录 1. 网络简介 1.1 独立模式和互联网络模式 1.2 局域网LAN和广域网WAN 2. 协议和协议分层 2.1 协议的作用 2.2 协议分层 2.3 OSI七层模型 3.2 TCP/IP四层(五层)模型 3. 网络通信原理 3.1 协议报头 3.2 局域网和解包分用 3.3 广域网和跨网络 4. 网络中的地址 4…

vscode 快速打印console.log

第一步 输入这些 {// Print Selected Variabl 为自定义快捷键中需要使用的name&#xff0c;可以自行修改"Print Selected Variable": {"body": ["\nconsole.log("," %c $CLIPBOARD: ,"," background-color: #3756d4; padding:…

二十七、W5100S/W5500+RP2040树莓派Pico<iperf 测速示例>

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

【Verilog语法】

Verilog语法 1. Verilog语法1.1 拼接运算符1.2 运算符优先级1.3 注释1.4 关键字1.5 模块结构1.6 结构语句1.7 赋值语句1.8 条件语句1.9 状态机1.10 OSI七层模型 1. Verilog语法 1.1 拼接运算符 1.2 运算符优先级 1.3 注释 1.4 关键字 1.5 模块结构 1.6 结构语句 1.7 赋值语句 …