为什么每个线程都需要创建一个栈?

有四个函数A、B、C、D,地址分别为100、200、300、400;有两个线程同时执行;

1)假如只有一个栈

 

  • 函数A在线程1中执行的时候,调用了函数B,将函数A中下一条指令的地址入栈(104),然后执行函数B;
  • 函数B中又执行了Yield()函数(蓝色,Yield()的作用可以理解为切换线程),Yield()切换到地址300处的线程,执行线程2,同时将下一条指令的地址入栈(204);
  • 接下来执行函数C,同样道理调用方法D,304入栈;
  • 最后执行函数D,Yield() 会跳到地址204继续执行204;
  • 紧接着,函数B执行完,会返回,返回地址是栈顶的值(404),这里的返回地址本应该是104;

因此,多个线程共用一个栈就会出现问题!

2)每个线程一个栈

再切换线程时,同时也要切换栈,这里就需要一个数据结构TCB(Thread control block)来存储栈的指针;每个线程都有一个TCB。

 

线程2中的Yield()函数应该改写成如下格式:

void Yield(){TCB2.esp=esp; esp=TCB1.esp;jmp 204; 
}Yield(){TCB2.esp=esp; esp=TCB1.esp;jmp 204; 
}

执行过程:

 

  • 在A函数中,调用B,将地址104入栈(esp=1000);
  • 在函数B中执行Yield(),保存当前栈指针TCB1.esp =esp,同时切换栈指针esp=TCB2.esp,将地址204入栈,跳转到函数C(esp=1000);
  • 在函数C中调用函数D,将地址304入栈(esp=2000);
  • 函数D执行Yield(),保存栈指针,切换栈指针,将地址404入栈,跳转到函数B,继续执行地址204处的代码;
  • 执行完毕,执行 '}' ,弹出线程1栈的栈顶地址204,发现此处重复执行地址204处的指令;

3)最终

线程2的Yield():

void Yield(){TCB2.esp=esp; esp=TCB1.esp;
}

这样在2)中第四步执行时,不再使用jmp 204跳转,而是执行 '}' ,将线程1中的栈顶地址出栈。

 

 

 

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

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

相关文章

莎士比亚,肯尼迪总统,孔子,奥巴马总统,马克吐温,梵高,比尔盖茨等13位名人阔谈微博(中英双语版本)...

2019独角兽企业重金招聘Python工程师标准>>> 作者: ganzhijie 发表于 2010-09-02 10:11 原文链接 阅读: 21 评论: 0 John F. Kennedy-“Ask not what your twitter can do for you, ask what you can do for your twitter.”肯尼迪总统-“不要问你的微博能为你做些什…

centos 本地化配置

2019独角兽企业重金招聘Python工程师标准>>> 最近使用svn更新的时候经常出现一些奇怪的错误。经过查询得知是本地化环境没有配置,导致的。记录以下解决方法。 本人环境:centos 5.x 错误现象: [Copy to clipboard]View Code ERRORs…

MySQL连接查询

1.分类 MySQL连接可以分为: 1)内连接 2)外连接 左外连接右外连接全外连接 3)自然连接 自然内连接(NATURAL JOIN)自然左外连接(NATURAL LEFT JOIN)自然右外连接(NATURAL RIGHT JOIN) 4)交叉连接 2.语法 SELECT…

IP编址(包括网络地址和广播地址)

1.总述 IP地址使用32位二进数表示,每一个主机或路由器的接口都有全局唯一的IP地址(NAT是个例外),它由网络号(NetID)和主机号(HostID)组成,它可以分为五类,如下: 2.地址划分 1)A…

面试题:谈谈你对TCP的认识

一 TCP 1. 简介 首先,TCP是一个传输层协议,提供进程到进程之间的可靠性数据传输服务,还提供流量控制和差错控制等机制。 其次,TCP是面向连接的,其通信模式是全双工的;面向连接是指: 在发送数…

面试题:MySQL的innodb和myisam

一 Innodb 1. 简介 索引是一种排好序的用于快速查找的数据结构。 **根据官网手册InnoDB支持B-tree索引、聚簇索引(Clustered indexes)、全文索引(Full-text search indexes)、不支持hash索引(InnoDB在内部利用哈希索引来实现其自适应哈希索引功能&#xff09…

用Markup Validation Service进行网页的W3C标准语法验证(c#)

W3C提供免费的Markup Validation Service,这是一个可以验证Html/XHtml文档的语法规范的公共服务。在某种程度上,有了它,我们再也不用为不能全面及时检测众多浏览器和五花八门的js/css不兼容性而痛不欲生了。^-^。 使用方法很简单,…

为什么MySQL索引更适合B+树而不是二叉树、B树

一 数据库为什么使用B树 1. 与二叉树相比 二叉树相比于顺序查找的确减少了查找次数,但是在最坏情况下,二叉树有可能退化为顺序查找。而且就二叉树本身来说,当数据库的数据量特别大时,其层数也将特别大。二叉树的高度一般是log_2…

MDOP套装之app-v安装使用及功能说明

最近尝试了瑞友天翼的虚拟化产品,感觉还不错,正好手上又下载了个mdop套装,顺手做了个app-v实验,其他实验教程后期继续推出。 一、服务端的安装 二、排序工具的安装 三、客户端的安装 四、使用排序工具虚拟化一个程序 五、发布虚…

容器技术之Dockerk8s知识笔记

本文带你快速了解Kubernetes与Docker 让你对容器与虚拟机的区别、Docker与k8s有一个快速的了解 目录 演变史容器与虚拟机的区别K8S与Docker概念DockerK8S演变史 传统部署时代: 早期,将单一的应用服务运行在物理服务器上,无法给服务器的应用…

Container.ItemIndex 获取reapeater行号

<div class"<%# (Container.ItemIndex)4?"class3":"class4"%>"></div>取到第五行的行号&#xff0c;用一个三元运算符来判断div的样式。 图中container.itemindex(container.ItemIndex-5)是不对的&#xff0c;最上面的代码才…

容器技术之快速了解K8S各抽象资源及组件架构

带你快速了解Kubernetes主要概念和组件架构。 Kubernetes的组件和架构比较多&#xff0c;功能也比较多。 如果详细探讨&#xff0c;每个Kubernetes组件都可以单独写篇博客详细讲解。 我们这里是快速了解&#xff0c;就写的相对比较简单一些。 主要是针对不熟悉Kubernetes的…

Python可视化神器之pyecharts

目录 概述安装参数实例 柱状图-Bar饼图-Pie折线图-Line散点图-scatter3D 柱状图-Bar3D仪表盘-Gauge雷达图-Radar词云图-WordCloud地理坐标系-Geo地图-Map概述 Pyecharts是一款将python与echarts结合的强大的数据可视化工具。使用 pyecharts 可以生成独立的网页&#xff0c;也…

腾讯的强大不是偶然,小马哥很强大

为什么80%的码农都做不了架构师&#xff1f;>>> 其实自己对于腾讯没什么好感&#xff0c;不过也没有太多的坏感&#xff0c;之前还有一篇日志&#xff0c;小批评了一下腾讯&#xff0c;今天看到小马哥写给内部员工的反思邮件。记录下两点提醒自己&#xff1a;对待敌…

计算机三级网络技术第一道大题 网络地址 主机号 直接广播地址 网络技术

加粗样式#计算机三级网络技术 ##网络地址&#xff0c;直接广播地址&#xff0c;主机号&#xff0c;子网中第一个可以IP地址&#xff0c;子网中最后一个可用IP地址 这是我在备考计算机三级网络技术中&#xff0c;写的几个例题&#xff0c;有哪里错的&#xff0c;还请大佬们帮忙纠…

SQL Server2008 附加数据库时出错

开机后附加数据库失败&#xff1a; 1.正常操作附加数据库。 右键单击sqlserver中的数据库&#xff0c;选择【附加】左击【添加】,选择文件路径,左击【确定】&#xff0c;之后弹出“附加数据库时出错”&#xff1a;确定&#xff0c;继续下一步进而查看原因&#xff0c;如图&…

j2me 学习资料

为什么80%的码农都做不了架构师&#xff1f;>>> 1:J2ME移动应用开发实战视频教程 http://www.pconline.com.cn/pcedu/videoedu/asp/0809/1425959.html 转载于:https://my.oschina.net/sunyh/blog/10534

VSTO应用程序中加入键盘钩子

在VSTO应用程序中有时为了处理一些快捷按键操作等实现一些特殊的功能&#xff0c;此时需要对键盘进行挂钩&#xff0c;此时使用P/Invoke函数实现&#xff0c;参考如下&#xff1a; VSTO加载和卸载时进行钩子的初始化和卸载 代码 KeyboardHook hook;privatevoidThisAddIn_Startu…

深入理解JavaScript中的this关键字

在JavaScript中this变量是一个令人难以摸清的关键字&#xff0c;this可谓是非常强大&#xff0c;充分了解this的相关知识有助于我们在编写面向对象的JavaScript程序时能够游刃有余。 对于this变量最要的是能够理清this所引用的对象到底是哪一个&#xff0c;也许很多资料上都有自…

NET中使用Identity+CodeFirst+Jwt实现登录、鉴权

目录 前言 一、创建上下文类 1.自定义MyContext上下文类继承IdentityDbContext 2.在Program中添加AddDbContext服务 二、使用Migration数据迁移 1.在控制台中 依次使用add-migration 、updatebase 命令 2.如何修改表名 3.如何自定义字段 三、使用Identity实现登录、修改密码 …