线程间的堆栈空间问题?

4号机器人 2011-04-23 06:05:19
一进程拥有一个堆栈段空间,进程所属的所有线程共用一个堆栈段,也就是说所有的线程共用一个堆栈对吗?如果是,问题就来了:在不同线程的运行过程中,他不同于单线程的函数调用。
1、单线程的函数调用,再多的函数调用都是串行的。即:在堆栈使用中不会冲突,不会因为一个函数的不调用而使之前函数使用的栈破坏,因为一个函数的调用是在函数调用返回后才可调用下一个函数,函数调用是顺序的。
2、多线程的函数调用就不同了,如果不同函数的调用都在一个栈段中,那就会有冲突,因为多线程的函数调用是平行的,因为一个函数的调用可能还没退出,就被切换为另一个线程的函数调用,这样就可能导致先前另一个线程函数调用栈数据的破坏。
在WINDOWS编程中多线程函数调用到底是怎么实现的,求详细解答。
...全文
408 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lactoferrin 2011-04-23
  • 打赏
  • 举报
回复
如果读写超过了保留栈空间,就发生异常
4号机器人 2011-04-23
  • 打赏
  • 举报
回复
好像是对流数据缓存的保护,当数据流过多时超过缓存界限,就执行int3指令,从而进入中断程序,继而控制流数据的输入减缓,当数据流降下来后就又继续处理。当时看的那种方法觉得程序设计很巧妙,后来忘了,具体是什么不太清,好像是int3,也可能是别的。但现在细想不太对劲,数据缓存的指针是sp不是ip呀怎么让程序自己“感知”到自己执行到什么地方了?
Lactoferrin 2011-04-23
  • 打赏
  • 举报
回复
int3是针对代码的吧,windows中内存保护都不怎么用段机制了
4号机器人 2011-04-23
  • 打赏
  • 举报
回复
我记的在哪看的用int3保护什么忘了,好像也是当程序溢出后就执行了int3进入用户的中断处理程序,把故障消除后程序继续运行。现在又找不回来了,你见的多,有这回事没,具体是什么?说下
上面你说的是页故障吧,不是段故障
Lactoferrin 2011-04-23
  • 打赏
  • 举报
回复
windows中栈保留空间的最低部分是不可读写的,到了这里就会有异常
4号机器人 2011-04-23
  • 打赏
  • 举报
回复
明白了,再问下,栈由系统分配后,一定是有限的一段内存区域,此区域的使用量是由程序及数据结构决定的。因为函数的调用是程序定制的。所以在某些情况下有可能栈的使用会溢出这一段内存区域,如果超出了,使用别的内存空间的程序就会出错。怎么不让它超出,并有保护机制?好像在哪看过是用int3来保护,但细想不对呀?超出的是sp指针,不是IP指针呀?int3不会被执行呀
Lactoferrin 2011-04-23
  • 打赏
  • 举报
回复
堆是堆,栈是栈,不同的线程的栈空间不同
4号机器人 2011-04-23
  • 打赏
  • 举报
回复
[Quote=引用楼主 hsh188d88452d2 的回复:]
一进程拥有一个堆栈段空间,进程所属的所有线程共用一个堆栈段,也就是说所有的线程共用一个堆栈对吗?如果是,问题就来了:在不同线程的运行过程中,他不同于单线程的函数调用。
1、单线程的函数调用,再多的函数调用都是串行的。即:在堆栈使用中不会冲突,不会因为一个函数的不调用而使之前函数使用的栈破坏,因为一个函数的调用是在函数调用返回后才可调用下一个函数,函数调用是顺序的。
2、多线程的函数调用就不同了……
[/Quote]
"1、单线程的函数调用,再多的函数调用都是串行的。即:在堆栈使用中不会冲突,不会因为一个函数的调用...."“不”字去掉

21,497

社区成员

发帖
与我相关
我的任务
社区描述
汇编语言(Assembly Language)是任何一种用于电子计算机、微处理器、微控制器或其他可编程器件的低级语言,亦称为符号语言。
社区管理员
  • 汇编语言
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧