从上下文切换谈thread_local工作原理

thread_local是什么

熟悉多线程编程的小伙伴一定对thread_local不陌生,thread_local 是 C++11 引入的一种存储类说明符,用于定义每个线程都有其独立实例的变量。每个线程对这些变量有自己的副本,而不共享其他线程的副本。这在多线程编程中非常有用,确保线程之间的数据隔离,防止数据竞争。

但是thread_local的表现又很奇怪,你说它是全局变量吧,但它又被每个线程私有,比如下面这个例子:

#include <iostream>
#include <thread>
#include <stdio.h> // 定义一个 thread_local 变量
thread_local int local_var = 0; void thread_function(int id) {
local_var = id;
printf("%x\n", &local_var);
} int main() {
std::thread t1(thread_function, 1);
std::thread t2(thread_function, 2); t1.join();
t2.join(); return 0;
}

输出:

地址不同,说明两个线程里的local_var变量不是同一个。

但是你说它是局部变量吧,它的生命周期又很长,thread_local 变量的生命周期从线程创建时开始,到线程结束时结束。

其实抽象出它的具体含义就是:

每个线程独立实例: 每个线程对 thread_local 变量都有自己的独立副本,不会与其他线程的副本共享。

生命周期: thread_local 变量的生命周期从线程创建时开始,到线程结束时结束。

那么问题来了,每个线程都有自己的独立副本,在访问的时候又互不影响,这个是怎么实现的呢?这就引出了上下文切换这个概念。

上下文切换

我们先看一下最开始的thread_function对应的汇编代码:

寄存器fs记录了当前正在运行的线程所有的thread_local变量所在内存块的首地址。不同的线程,它的上下文也是不同的,所以寄存器fs的值也是不同的;这样就非常巧妙的通过线程的上下文切换区分了不同线程对应的thread_local;

如图:

假设现在线程1正在执行,操作系统会创建线程1的上下文,上下文一般是指当前寄存器的值,他们包含了当前程序运行的状态,比如栈指针esp,程序计数器eip,在此例中也包含fs,fs记录了当前线程栈上的thread_local变量的起始地址。

同理我们再创建另一个线程2:

线程1和线程2对应着程序运行栈上的不同区域,因此他们的fs寄存器的值也是不同的。所以当发生线程上下文切换的时候,操作系统会恢复将要运行的线程的上下文(寄存器状态)。这样每个线程也就能自然通过fs对应到它的thread_local变量。

总结

本篇博文先是介绍了thread_local的特性:

  • 每个线程独立实例: 每个线程对 thread_local 变量都有自己的独立副本,不会与其他线程的副本共享。

  • 生命周期: thread_local 变量的生命周期从线程创建时开始,到线程结束时结束。

然后通过上下文切换的概念介绍了实现的方法。有关更多上下文切换的内容,可参照《CPU眼中的C++》5.8节。

refer

《CPU眼中的C++》

从上下文切换谈thread_local工作原理的更多相关文章

  1. 浅谈React工作原理

    浅谈React工作原理:https://www.cnblogs.com/yikuu/p/9660932.html 转自:https://cloud.tencent.com/info/63f656e0b ...

  2. [iOS]浅谈NSRunloop工作原理和相关应用

    一. 认识NSRunloop  1.1 NSRunloop与程序运行 那么具体什么是NSRunLoop呢?其实NSRunLoop的本质是一个消息机制的处理模式.让我们首先来看一下程序的入口——main ...

  3. TODO:浅谈pm2基本工作原理

    TODO:浅谈pm2基本工作原理 要谈Node.js pm2的工作原理,需要先来了解撒旦(Satan)和上帝(God)的关系. 撒旦(Satan),主要指<圣经>中的堕天使(也称堕天使撒旦 ...

  4. 浅谈dedecms模板引擎工作原理及其自定义标签

    浅谈dedecms模板引擎工作原理: 理解织梦模板引擎有什么意思? 可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步. 理解织梦会使我们写PHP代码是更顺手,同时能学 ...

  5. [转自SA]浅谈nginx的工作原理和使用

    nginx apache 简单对比 nginx 相对 apache 的优点: 轻量级,同样起web 服务,比apache 占用更少的内存及资源 抗并发,nginx 处理请求是异步非阻塞的,而 apac ...

  6. (转)浅谈dedecms模板引擎工作原理及自定义标签

    理解织梦模板引擎有什么意义?一方面可以更好地自定义标签.更多在于了解织梦系统,理解模板引擎是理解织梦工作原理的第一步.理解织梦会使我们写php代码时更顺手,同时能学习一些php代码的组织方式. 这似乎 ...

  7. 浅谈malloc()和free()工作原理

    编程之路刚刚开始,错误难免,希望大家能够指出.  malloc()和free()是我经常需要用到的函数,一般情况下,C程序使用malloc()在堆上分配内存,free()释放内存,两者的参数和返回值就 ...

  8. 浅谈C++编译原理 ------ C++编译器与链接器工作原理

    原文:https://blog.csdn.net/zyh821351004/article/details/46425823 第一篇:      首先是预编译,这一步可以粗略的认为只做了一件事情,那就 ...

  9. 【夯实Nginx基础】Nginx工作原理和优化、漏洞

    本文地址 原文地址 本文提纲: 1.  Nginx的模块与工作原理    2.  Nginx的进程模型    3 . NginxFastCGI运行原理        3.1 什么是 FastCGI   ...

  10. Nginx 工作原理和优化、漏洞

    1.  Nginx的模块与工作原理 Nginx由内核和模块组成,其中,内核的设计非常微小和简洁,完成的工作也非常简单,仅仅通过查找配置文件将客户端请求映射到一个location block(locat ...

随机推荐

  1. 长连接网关技术专题(四):爱奇艺WebSocket实时推送网关技术实践

    本文由爱奇艺技术团队原创分享,原题<构建通用WebSocket推送网关的设计与实践>,有优化和改动. 1.引言 丛所周之,HTTP协议是一种无状态.基于TCP的请求/响应模式的协议,即请求 ...

  2. Python 进阶:深入理解 import 机制与 importlib 的妙用

    大家好,今天我们来深入探讨 Python 中的导入机制和 importlib 模块.相信不少朋友和我一样,平时写代码时可能只用过最基础的 import 语句,或者偶尔用 importlib.impor ...

  3. React中的 ref 及原理浅析

    前言 对于 ref 的理解,我们一部人还停留在用 ref 获取真实 dom 元素和获取组件层面上,但实际 ref 除了这两项功能之外,在使用上还有很多小技巧.本章我们就一起深入探讨研究一下 React ...

  4. 修复展锐SL8541E 偶现开机无法启动OTG

    哎,又是紫光展锐,真的拉啊!!! 问题是这样的,当USB口插上OTG线再开机,会偶现无法启动OTG.这个问题排查了好久,现在终于改好了,下面记录一下分析过程. 异常log[上]和正常log[下] 前面 ...

  5. zsh 切换root用户后,命令执行后要卡顿2s左右

    在 oh-my-zsh 进入 包含 git 仓库目录时,会变的比平时慢/卡顿 原因是因为 oh-my-zsh 要**获取 git 更新信息 ** **解决办法: ** 设置 oh-my-zsh 不读取 ...

  6. Solution Set - “盛开无法定格的花”

    目录 0.「ARC 160D」Mahjong 1.「BJOI 2017」「洛谷 P3715」魔法咒语 2.「清华集训 2017」「洛谷 P4227」我的生命已如风中残烛 3.「集训队互测 2018」「 ...

  7. 化繁为简、性能提升 -- 在WPF程序中,使用Freetype库心得

    本人使用WPF开发了一款OFD阅读器,显示字体是阅读器中最重要的功能.处理字体显示有多种方案,几易其稿,最终选用Freetype方案.本文对WPF中如何使用Freetype做简单描述. OFD中有两种 ...

  8. 配置教程-jdk-tomcat-maven

    二.下载并安装JDK 选择一个适合自己的JDK版本下载并安装即可,具体流程不详述. 二.环境变量配置 1.右键桌面上"我的电脑">>"属性",在弹出 ...

  9. 使用SpongeExt快捷完成CudaSPONGE结合PySAGES的增强采样

    技术背景 在前面的一些文章中,我们介绍过关于CudaSPONGE的安装和基础使用方法,CudaSPONGE提供的Python接口,PySAGES增强采样软件的基本使用方法,还有一篇关于CudaSPON ...

  10. day05-面向对象编程:基础语法

    Java面向对象:类的基础语法 [ 任务列表 ] 1.面向对象快速入门 2.什么是面向对象 3.类的基础语法--构造器 4.类的基础语法--this关键字 5.类的基础语法--封装 6.类的基础语法- ...