多线程 - 你知道线程栈吗

iOS多线程——你要知道的NSThread都在这里 你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里转载请注明出处 http://www.jianshu.com/p/973f0a5e0ec3本系列文章主要讲解iOS中多线程的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法详解,本系列文章不涉及基础的线程/进程、同步/异步、阻塞/非阻塞、串行/并行,这些基础概念,有不 阅读详情

问题

1. local 变量的压栈和出栈过程
void func1(){
    int a = 0;
    int b = 0;
}
系统中有一个栈顶指针,每次分配和回收local 变量时,其实就是移动栈指针。

2. static local变量的分配风险
void func2(){
    static int a = 0;
}
这个变量a可能会被分配多次,因为如果func2可能同时被多个线程调用,也就是函数在分配内存时是可能出现线程切换的。

问题:
如
void func3(){
int a;
int b;
}

void func4(){
int c;
int d;
}
假设,func3和func4分别被两个线程调用,并且func3先于func4执行,并且4个变量压栈的顺序分别是a、b、c、d。按照上面第1个说明,这个时候栈顶指针指向d。
如果,这个时候func3先执行完,那么这个时候,系统要回收b和a,但是b并不在栈顶,所以,无法移动栈顶指针,所以,b和a无法回收。最复杂的情况可能如下,压栈的顺序是a、c、d、b,这个时候b可以正常回收。当要回收a时,会不会误把d当作a给回收了?应该怎么解释这个问题呢。
显然,事实上并非上面所述,因为线程里有一个很重要的属性stacksize,它让我们隐约感觉到,线程是拥有私有的栈空间的,如果这样,abcd的压栈出栈就不会有问题了,因为他们并不保存在一起。


pthread线程栈

#include <stdio.h>
#include <pthread.h>

void* thread1(void* a)
{
	char m[8388608];
	printf("thread1\n");
}

int main(){
	pthread_t pthread_id;
	pthread_attr_t thread_attr;
	int status;

	status = pthread_attr_init(&thread_attr);
	if(status != 0)
		printf("init error\n");

	size_t stacksize = 100;
	status = pthread_attr_getstacksize(&thread_attr, &stacksize);
	printf("stacksize(%d)\n", stacksize);
	//printf("size(%d)\n", sizeof(int));

	status = pthread_create(&pthread_id, NULL, thread1, NULL);
	while(1)
	{}
	return 0;
}

运行结果:

stacksize(8388608)
段错误

分析

pthread_attr_getstacksize可以获得线程的私有栈的大小,我这个机器是8388608字节,为8M,也就是私有栈最大是8M,所以,创建的一个线程函数里有个局部数组长度为8M,显示段错误(虽然数组大小和私有栈一样大,但是私有栈除了分配局部变量外,还要保存一些管理信息,所以肯定要小于8M),如果将数组长度减小一定的值,就可以看到thread1函数的打印信息。


pthread线程内存布局



我们从图上可以看出,两个线程之间的栈是独立的,其他是共享的,所以,在操作共享区域的时候才有可能出现同步需要,操作栈不需要同步。

最后我们知道,pthread也提供了私有堆机制,关于私有堆机制在以后说明。


java多线程学习(三)——线程栈 一、线程栈模型 线程栈模型是理解线程调度原理以及线程执行过程的基础。线程栈是指某时刻时内存中线程调度的栈信息,当前调用的方法总是位于栈顶,线程栈的内容是随着线程的运行状态变化而变化的,研究线程栈必须选择一个运行的时刻(指代码运行到什么地方) 上图中的栈A是主线程main的运行栈信息,当执行new JavaThreadDemo().threadMethod();方法时,threadMet 阅读详情

相关推荐

iOS多线程——你要知道的NSOperation都在这里

你要知道的iOS多线程NSThread、GCD、NSOperation、RunLoop都在这里转载请注明出处 http://www.jianshu.com/p/bf0916ee1492本系列文章主要讲解iOS中多线程的使用,包括:NSThread、GCD、NSOperation以及RunLoop的使用方法详解,本系列文章不涉及基础的线程/进程、同步/异步、阻塞/非阻塞、串行/并行,这些基础概念,有不

什么都不会的小菜鸟 3775

详解Java虚拟机栈

运行时栈帧结构局部变量表操作数栈动态连接方法返回地址由于跨平台性的设计,Java 的指令都是根据栈来设计的。不同平台 CPU 架构不同,所以不能设计为基于寄存器的。 优点是跨平台,指令集小,编译器容易实现,缺点是性能下降,实现同样的功能需要更多的指令。虚拟机栈是线程私有的,每个线程在创建时会创建一个虚拟机栈,其内部保存一个个的栈帧(Stack Frame),对应着一次次的 Java 方法调用。Java虚拟机以方法作为最基本的执行单元,“栈帧”是用于支持虚拟机进行方法调用和方法执行的数据结构......

m0_52029207的博客 1205

JVM Thread Stack线程栈分析

JVM Thread Stack线程栈分析

喵酱 985

线程内存 ---- 栈内存都是线程私有的

多线程执行时,在栈内存中,其实每一个执行线程都有一片自己所属的栈内存空间。进行方法的压栈和弹栈。 当执行线程的任务结束了,线程自动在栈内存中释放了。但是当所有的执行线程都结束了,那么进程就结束了。 ...

krismile__qh的博客 3676

【excel+vba】一表拆多表+不同收件人附带不同附件

快捷处理:拆分多个不同表 给不同人发送不同内容且附带附件

weixin_42779327的博客 2968

5分钟搞定DataDome滑块验证码:最新Capsolver API实战教程(含代理配置)

本文提供了一份利用Capsolver API快速自动化破解DataDome滑块验证码的实战教程。文章深入剖析了DataDome验证码的环境指纹与行为分析机制,并重点详解了确保成功率的住宅代理配置、API集成步骤及令牌使用等核心环节,帮助开发者高效集成稳定可靠的自动化解决方案。

milk8的博客 494

Java-底层建筑-JVM-第2篇-虚拟机栈 (线程私有)

Java - 底层建筑 - JVM - 第5篇 - 虚拟机栈 虚拟机栈出现的背景 由于跨平台的设计,Java指令都是根据栈来设计的。不同平台的CPU架构不同,所以不能设计为基于寄存器的 优点是跨平台,指令集少,编译器容易实现,确定是性能下降,实现同样的功能需要更多的指令 内存中的栈和堆 栈是运行时的单位,而堆是存储的单位 即:栈是解决程序的运行问题,即程序如何执行,或者说如何处理数据。堆解决的问题是数据存储的问题。即数据怎么放,放在哪儿 虚拟机栈的基本内容 Java虚拟机栈是什么? Java虚拟

qq_46489085的博客 1646

SAP移动类型

SAP移动类型移动类型定义 移动类型定义

qq_20593197的博客 6205

线程的私有存储空间

线程的私有存储空间

weixin_52259848的博客 2846

【胡学长 带你学 Global Mapper 】如何将影像地图转换为国家2000坐标系

多部门联合开展工作坐标数据不匹配怎么办?Hi,我是胡学长!今天教大家如何利用Global Mapper将谷歌影像数据转换为国家2000坐标系影像数据 。

一起来交流学习吧 1万+

Autosar结合simulink的汽车应用层软件开发实例

本文基于汽车应用开发案例,并结合Autosar相关知识,生成具有Autosar标准的汽车应用层开发代码,以供学习和参考。以上就是本篇内容,主要是利用Simulink创建Autosar接口并进行端口映射的方法。

m0_64899535的博客 2152

多线程 - 你知道线程栈吗(私有栈)

问题 1. local 变量的压栈和出栈过程 void func1(){     int a = 0;     int b = 0; } 系统中有一个栈顶指针,每次分配和回收local 变量时,其实就是移动栈指针。 2. static local变量的分配风险 void func2(){     static int a = 0; } 这个变量a可能会被分配多次,因为如果

rongwenbin的专栏 2900

用 Python 和 XGBoost 进行疾病诊断预测

疾病诊断预测是医疗领域的重要研究方向,准确的疾病诊断预测可以帮助医生提前制定治疗方案,提高治疗效果,降低医疗成本。本文章的目的是介绍如何使用 Python 和 XGBoost 算法构建疾病诊断预测模型。范围涵盖了从数据预处理、模型训练到模型评估的整个流程,同时通过实际案例展示如何将该模型应用于疾病诊断预测中。本文首先介绍了疾病诊断预测的背景和 XGBoost 算法的核心概念,然后详细讲解了 XGBoost 算法的原理和具体操作步骤,包括 Python 代码实现。

AI Python 编程之道的博客 1064

多线程 - 你知道线程栈吗 http://blog.youkuaiyun.com/gykimo/article/details/9132157

版权声明:本文为博主原创文章,未经博主允许不得转载。 目录(?)[+] 问题 1. local 变量的压栈和出栈过程 void func1(){     int a = 0;     int b = 0; } 系统中有一个栈顶指针,每次分配和回收local 变量时,其实就是移动栈指针。 2. static local变量的分配风险 void func2(){

诺尔曼 535

基于CrossSim的存储硬件原型机ANN仿真:MNIST手写数字识别实现与分析

本项目基于CrossSim仿真平台,在存储硬件原型机上实现了MNIST手写数字识别的ANN模型。通过搭建CrossSim仿真环境,设计传统ANN基准模型和考虑硬件非理想特性的CrossSim模型,对比分析了不同配置下的识别性能。实验结果表明,在引入硬件噪声和器件变异的情况下,模型准确率仍能达到95%以上,验证了存储内计算架构的可行性。研究为存储硬件与计算单元融合提供了实验依据,展示了CrossSim在神经形态计算系统仿真中的实用价值。

huanghm88的专栏 596

200、从反激到LLC:工程师的成长之路

文章摘要: 本文以工程师视角探讨从反激式到LLC电源设计的思维转变。通过48V通信电源故障案例,揭示LLC谐振电容ESR温度特性引发的隐患,强调LLC需精确计算与测试。对比反激与LLC的核心差异:反激需控制寄生参数(如漏感尖峰、电容ESR),而LLC的关键在于频率响应和死区时间优化。作者提出三大思维转变:从匝比计算转向增益曲线分析,从时域波形观察转向频域频谱诊断,从元件更换转向参数调整。最后给出实战建议,包括建立故障库、关注元件参数细节及示波器调试技巧,指出工程师需从"控制"思维升级为"谐振"思维,实现技术

Jack010169的博客 322

你真的知道什么是多线程吗?为什么要学习多线程?

多线程是指,将原本线性执行的任务分开成若干个子任务同步执行,这样做的优点是防止线程“堵塞”,增强用户体验和程序的效率。缺点是代码的复杂程度会大大提高,而且对于硬件的要求也相应地提高。

初尘屿风的博客 1万+

华为的C语言编程规范.pdf

华为技术有限公司内部技术规范。本规范制定了编写C语言程序的基本原则、规则和建议。从代码的清晰、简洁、可测试、安全、程序效率、可移植各个方面对C语言编程作出了具体指导。

什么是多线程?如何实现多线程?

【转】什么是线程安全?怎么实现线程安全?什么是进程?什么是线程?什么是线程安全?添加一个状态呢?如何确保线程安全?synchronizedlock 转自:https://blog.youkuaiyun.com/csdnnews/article/details/82321777 什么是进程? 电脑中时会有很多单独运行的程序,每个程序有一个独立的进程,而进程之间是相互独立存在的。比如下图中的QQ、酷狗播放器、电脑...

beidaol的专栏 29万+

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

VC中sqlite的使用

在VC中对sqlite的使用,实现数据库大批数据的快速插入,读取数据库中的数据在ListCtrl中显示

【linux】多线程(三)线程控制,如何创建多线程,线程访问其它线程的独立栈,__thread编译选项,线程分离pthread_detach

一、如何创建多线程 二、全局变量 三、线程访问其它线程的独立栈 四、__thread编译选项 五、线程分离pthread_detach

重铸自身根基的博客 1369

WINCC7.3破解文件

WINCC7.3硬件够破解文件,有需要的下载!WINCC7.3硬件够破解文件,有需要的下载!

C++多线程以及线程池

1 线程 1.1 简介   线程(英语:thread)是操作系统能够进行运算调度的最小单位。大部分情况下,它被包含在进程之中,是进程中的实际运作单位。一条线程指的是进程中一个单一顺序的控制流,一个进程中可以并发多个线程,每条线程并行执行不同的任务。在Unix System V及SunOS中也被称为轻量进程(lightweight processes),但轻量进程更多指内核线程(kernel thread),而把用户线程(user thread)称为线程。   同一进程中的多条线程将共享该进程中的全部系统资源

梦的灰色边沿... 5975

多线程redis解决线程安全问题?你知道这些吗?

​Memcached 执行主逻辑也是在 worker 线程里,模型更加简单,实现了真正的线程隔离,符合我们对线程隔离的常规理解。​ 使用了单线程后,可维护性高。多线程模型虽然在某些方面表现优异,但是它却引入了程序执行顺序的不确定性,带来了并发读写的一系列问题,增加了系统复杂度、同时可能存在线程切换、甚至加锁解锁、死锁造成的性能损耗。但如果严格来讲从 Redis 4 之后并不是单线程,除了主线程外,它也有后台线程在处理一些较为缓慢的操作,例如清理脏数据、无用连接的释放、大 key 的删除等等。

蓝鲸鱼计算机软件开发工作室 1438

lua 如何支持多线程操作?

栈的理解 要向了解lua多线程,你就要知道栈的含义。这里我就直接摘录博客上的一些见解: 栈就是一段特殊内存,什么是栈呢?举个例子,一个只有上面打开的盒子,现在有三本书离散数学、c语言、汇编语言,需要将这三本书一本一本的放进去,先将离散数学放进去,然后c语言,接着汇编语言,现在又需要将三本书拿出去,只能先拿汇编语言,再拿c语言接着再拿离散数学,栈就是这样的特点,后进先出。 栈的大小...

点滴路程 2万+

【C++】关于多线程,你应该知道这些

本篇博客主要讲解了多线程相关的类 thread、mutex、atomic 和 condition_variable、线程安全的智能指针和单例模式等。

joy.728的博客 1370

JAVA中多线程时候的栈(图解)

首先每个线程都有自己的名称–用Thread类的getName()方法就能获取名字了 可以在JAVA的API文档找到对应的方法. 例子: class Test extends Thread { private String name; Test(String name) { this.name = name; } public void run() { for(int i=...

weixin_42947972的博客 2792
上一篇: C++ - static_cast | reinterpret_cast | dynamic_cast
下一篇: 经典软件设计模型 - 事件驱动模型
G机器猫
博客等级 码龄16年 106粉丝 74原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值