多线程 - 你知道线程栈吗

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

Adams与Matlab联合仿真入门:从零搭建你的第一个动力学模型

本文为Adams与Matlab联合仿真新手提供了一份详尽的入门指南。文章从软件环境配置、版本兼容性检查讲起,逐步演示了如何在Adams中构建单摆动力学模型并定义输入输出接口,以及在Matlab/Simulink中搭建控制回路。通过一个完整的受控单摆实例,手把手教你完成从模型导出、模块生成到执行联合仿真的全流程,帮助你快速搭建并运行第一个联合仿真模型,实现动力学与控制系统的协同验证。

g5h6i7j的博客 699

从收音机到Arduino:手把手教你用BJT三极管搭建一个简易音频放大器(附电路图与元件清单)

本文详细介绍了如何使用BJT三极管搭建简易音频放大器,涵盖电路原理、元件选择、设计步骤及调试技巧。通过实践项目帮助电子爱好者深入理解BJT的放大特性,并提供与Arduino结合的扩展应用方案,适合创客和DIY玩家。

aitie1479的博客 439

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

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

qq_46489085的博客 1646

伺服电机入门01

编码器输出 旋转信号 , 接收端: 使用ADC 捕捉旋转信号 ,转成数字信号,驱动器得到数字处理, 因为信号量是模拟信号, mcu mpu 等芯片通常内部处理是数字,通过adc 得到数字cpu 才能识别 传输过来的pos 等信息。IPM 芯片示例, IRAM256A 这个芯片已经停产,有换新的,,下面示例来自stmbl 高功率方案,4 步进电机 有全步控制,半步控制 ,微步控制,FOC控制,步进电机也是可以做伺服系统的。以下面几种信号是可以细分,也就是通过细分增加编码器的分辨率,

qq_25160559的博客 969

线程的私有存储空间

线程的私有存储空间

weixin_52259848的博客 2846

RAG 赋能客服机器人:多轮对话与精准回复

在人工智能技术飞速发展的今天,客服机器人已成为企业提升服务效率的重要工具。然而,传统客服系统在多轮对话连贯性和精准回复能力上存在明显短板。检索增强生成(Retrieval-Augmented Generation, RAG)技术通过结合大语言模型(LLM)与外部知识库,为解决这一问题提供了创新路径。本文将深入探讨 RAG 在客服机器人中的应用,重点分析其如何实现多轮对话与精准回复,并结合实际案例与技术框架展开讨论。

shuizhudan223的博客 2142

Spec-Kit实战:用‘规范驱动开发’重构一个老旧Node.js项目(避坑指南)

本文详细介绍了如何使用Spec-Kit工具通过‘规范驱动开发’(SDD)重构老旧Node.js项目。从逆向工程提取规范到增量改造策略,再到避免典型陷阱,提供了实战指南和避坑技巧,帮助开发者高效实现架构现代化,显著提升代码质量和维护效率。

weixin_42525582的博客 555

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

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

rongwenbin的专栏 2900

Aloudata Agent :基于 NoETL 明细语义层的分析决策智能体

这是包括我们在内的一些厂商探索的一个新方向,这种方式先由大模型将自然语言转化为对指标语义层的查询请求(MQL,Metrics Query Language),再由指标平台将指标和维度的查询与计算逻辑转化为准确的 SQL 查询语句。用户查询经大模型语义解析后,将其转换为指标、维度及筛选条件的组合表达,并生成面向指标平台的 MQL,Aloudata CAN 指标平台的语义引擎将 MQL 转换为准确和可执行的查询 SQL,语义引擎内置函数体系与 SQL 解析器,确保语义转换的 100% 准确性。

Aloudata的博客 1663

多线程 - 你知道线程栈吗 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

CDD数据库文件制作(三)——服务配置(0x10)

根据诊断调查表进行每一步配置的详细操作,与背后逻辑解释 1.会话切换配置 1.1.根据诊断调查表进行信息提取(0x1001) 1.2.会话转换配置(0x1001) 1.3.根据诊断调查表进行信息提取(0x1002) 1.4.会话转换配置(0x1002) 1.5.根据诊断调查表进行信息提取(0x1003) 1.6.会话转换配置(0x1003) 1.7.会话切换配置完成后效果图 2.安全等级配置信息提取 2.1.安全访问配置(0x1001) 2.2.安全访问配置(0x1002) 2.3.安全访问配置(0x100

LOVE135149的博客 5838

基于Simulink的单级式光伏并网系统MPPT控制仿真

本文基于Simulink平台,详细介绍了单级式光伏并网系统的MPPT控制仿真实现。主要内容包括:1)阐述MPPT作为光伏系统"智能大脑"的核心作用;2)解析单级式系统架构及扰动观察法(P&O)算法原理;3)以10kW户用系统为例,分步骤演示建模过程,包括光伏阵列搭建、P&O控制器实现(含MATLAB代码)、并网控制设计等;4)通过仿真验证系统在光照突变下的动态响应性能,MPPT效率达98.3%。文章还提出了变步长P&O等优化方向,为光伏系统仿真与控制提供实用指导。

xiaoheshang_123的博客 111

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

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

初尘屿风的博客 1万+

SAP B1中文培訓教材_SDK

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

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

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

beidaol的专栏 29万+

汉书HE8,好用的汇编代码编写工具

汉书HE8,好用的汇编代码编写工具早期编写汇编代码所用功能强大

WINCC7.3破解文件

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

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

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

重铸自身根基的博客 1369

TMS_WebGMaps_1.9.8.0_Full_Source

TMS_WebGMaps_1.9.8.0_Full_Source 全源码 delphi cbuilder

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、付费专栏及课程。

余额充值