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;
}

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

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

相关文章

基于php+thinkphp的网上书店购物商城系统

运行环境 开发语言&#xff1a;PHP 数据库:MYSQL数据库 应用服务:apache服务器 使用框架:ThinkPHPvue 开发工具:VScode/Dreamweaver/PhpStorm等均可 项目简介 系统主要分为管理员和用户二部分&#xff0c;管理员主要功能包括&#xff1a;首页、个人中心、用户管理、图书分类…

问卷调查表单、表设计

一、DWSurvey实现&#xff1a; 参考文档&#xff1a;快速入门 | 调问开源问卷系统 管理员通过拖拽题型生成表单&#xff0c; 点击保存&#xff0c;预览&#xff0c;发布问卷。用户根据预览的地址&#xff0c;填写问卷提交。管理员可以在我的问卷里看到答卷情况。 关于数据存…

PCL安装与使用

1 apt安装 ubuntu20.04及以上版本下可以直接通过apt方式安装pcl编译好的二进制文件,二进制安装的版本为1.10。 sudo apt update sudo apt install libpcl-dev 2 源码安装 在pcl的github上下载对应的版本进行安装&#xff1a; https://github.com/PointCloudLibrary/pcl/rel…

Cut and Reorder

题目传送门 引 复杂度没算对导致不敢写&#xff0c;分析复杂度时还是多考虑势能&#xff0c;不然错过正解就亏了 解法 操作一可以一开始就做了 考虑状压 m a s k mask mask 是已加入序列的元素 转移枚举一段连续的区间即可 复杂度乍眼一看是 O ( n 2 2 n ) O(n^22^n) O(…

5G网络切片,到底是什么?

网络切片&#xff0c;是5G引入的一个全新概念。 一看到切片&#xff0c;首先想到的&#xff0c;必然是把一个完整的东西切成薄片。于是&#xff0c;切面包或者切西瓜这样的画面&#xff0c;映入脑海。 添加图片注释&#xff0c;不超过 140 字&#xff08;可选&#xff09; 然而…

找工作去哪个网站比较好

吉鹿力招聘网是一个专注于互联网岗位求职招聘的网站&#xff0c;提供海量的互联网人才储备。它主要覆盖了互联网类招聘&#xff0c;包括技术、产品、设计、运营、市场、销售等。吉鹿力招聘网的特点是用户量大&#xff0c;需求旺盛。如果你希望找工作&#xff0c;吉鹿力招聘网是…

Leetcode_46:全排列

题目描述&#xff1a; 给定一个不含重复数字的数组 nums &#xff0c;返回其 所有可能的全排列 。你可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff1a;[[1,2,3],[1,3,2],[2,1,3],[2,3,1],[3,1,2],[3,2,1]]示例 2&#xff1a; 输…

如果让你重新开始学 C/C++,你的学习路线会是怎么选择?

1. 第一阶段 学好 C 语言和 Linux 1.1 学好 C 语言 无论你是科班还是非科班&#xff0c;建议你一定要学好 C 语言&#xff0c;它应该作为你必须掌握好的语言。你要熟悉 C 语言的基本语法&#xff0c;包括&#xff1a; 顺序、条件、循环三大控制语句 C 中几大基元数据类型的用…

Java 算法篇-深入了解单链表的反转(实现:用 5 种方式来具体实现)

&#x1f525;博客主页&#xff1a; 小扳_-CSDN博客 ❤感谢大家点赞&#x1f44d;收藏⭐评论✍ 文章目录 1.0 单链表的反转说明 2.0 单链表的创建 3.0 实现单链表反转的五种方法 3.1 实现单链表反转 - 循环复制&#xff08;迭代法&#xff09; 3.2 实现单链表反转 - 头插法 3…

基于springboot+vue的学生毕业离校信息网站

项目介绍 该学生毕业离校系统包括管理员、学生和教师。其主要功能包括管理员&#xff1a;首页、个人中心、学生管理、教师管理、离校信息管理、费用结算管理、论文审核管理、管理员管理、留言板管理、系统管理等&#xff0c;前台首页&#xff1b;首页、离校信息、网站公告、留…

Linux 命令——modprobe

Linux 命令——modprobe modprobe命令用于智能地向内核中加载模块或者从内核中移除模块。 modprobe可载入指定的个别模块&#xff0c;或是载入一组相依的模块。modprobe会根据depmod所产生的相依关系&#xff0c;决定要载入哪些模块。若在载入过程中发生错误&#xff0c;在mo…

python 根据经纬度绘制点图 极投影

参考了python cartopy手动导入地图数据绘制底图/python地图上绘制散点图&#xff1a;Downloading:warnings/散点图添加图里标签_python add_feature-CSDN博客 点的颜色按照时间显示 # -*- coding: utf-8 -*- """ Created on Mon Nov 13 11:32:48 2023"&quo…

智慧工地源码:助力数字建造、智慧建造、安全建造、绿色建造

智慧工地围绕建设过程管理&#xff0c;建设项目与智能生产、科学管理建设项目信息生态系统集成在一起&#xff0c;该数据在虚拟现实环境中&#xff0c;将物联网收集的工程信息用于数据挖掘和分析&#xff0c;提供过程趋势预测和专家计划&#xff0c;实现工程建设的智能化管理&a…

postgresql安装

postgresql安装 1、windows下的安装 安装包下载地址&#xff1a;https://www.enterprisedb.com/downloads/postgres-postgresql-downloads 这里选择14.5版本进行安装&#xff0c;具体的安装步骤&#xff1a; 双击软件打开运行&#xff0c;弹出如下界面&#xff1a; 点击nex…

CountDownLatch使用

常用于多线程场景&#xff0c;待多线程都结束后方可继续主线程逻辑处理 CodeConstant 常量类 import java.util.HashMap; import java.util.Map;public class CodeConstant {public static final Map<String, Map<String, String>> CODE new HashMap<>();…

VUE 组合式API

响应式 data 选项式API_响应式 <template><h3>选项式API</h3><p>{{ message }}</p> </template> <script> export default {data(){return{message:"选项式API 绑定数据"}} } </script>组合式API_响应式 <…

博弈论入门

目录 什么是博弈&#xff1f; 博弈论的发展历史&#xff1f; 博弈的要素有哪些&#xff1f; 博弈的分类&#xff1f; 博弈论的应用 收益矩阵 纳什均衡的定义 博弈论的例子 1、田忌赛马 2、穷途困境 2.1优化反应函数法 2.2Nashpy库 2.3顶点枚举算法 3、Nash游戏 …

飞书开发学习笔记(五)-Python快速开发网页应用

飞书开发学习笔记(五)-Python快速开发网页应用 一.下载示例代码 首先进入飞书开放平台: https://open.feishu.cn/app 凭证与基础信息 页面&#xff0c;在 应用凭证 中获取 App ID 和 App Secret 值。 教程和示例代码位置:https://open.feishu.cn/document/home/integrating-…

WebSocket在node端和客户端的使用

摘要 如果想要实现一个聊天的功能&#xff0c;就会想到使用WebSocket来搭建。那如果没有WebSocet的时候&#xff0c;我们会以什么样的思路来实现聊天功能呢&#xff1f; 假如有一个A页面 和 B页面进行通信&#xff0c;当A发送信息后&#xff0c;我们可以将信息存储在文件或者…