在多线程中体会堆和栈的区别 多线程中栈与堆

最初涉及多线程程序涉及的时候经常会出现一些令人难以思议的事情,用堆和栈分配一个变量可能在以后的执行中产生意想不到的结果,而这个结果的表现就是内存的非法被访问,导致内存的内容被更改。

理解这个现象的两个基本概念是:在一个进程的线程共享堆区,而进程中的线程各自维持自己堆栈。

另一运行机制就是如果声明一个成员变量 如 charName[200],随着这段代码调用的结束,Name在栈区的地址被释放,而如果是 char * Name = newchar[200];情况则完全不同,除非显示调用delete否则Name指向的地址不会被释放。

理解了线程对 堆栈的可见性,和内存管理机制就能推测出笔者伊始提出的现象。

用一个 实例来深入理解这种机制。

在多线程中体会堆和栈的区别 多线程中栈与堆

在线程 1 中,

A ()

{

B();

C();

}

B()

{

栈or 堆分配变量 V;

将V的地址插入 公共队列;

}

线程 2 中:

D()

{

while(1)

{

处理公共队列;

}

}

在B中如果用栈区即采用临时变量的机制分配声明V和堆区,而者的结果是不同的。如果用栈区,如果变量地址为Am1-Am2这么大,退出B调用时候这段地址被释放,C函数可能将这段内存改写;这样当D执行的时候,从内存Am1-Am2中读取的内容就是被改过的了。

而如果用New(堆)分配,则不会出现那样的情况,因为没有显示对用delete并且堆对于线程共享,即2线程可以看到1线程在堆里分配的东西,所以不会发生误写。

这个问题是笔者在公司实习的时候发现的,因为当时刚刚涉及多线程程序设计,操作系统中如此简单的话题困扰笔者很久,希望可以对初涉C++多线程的读者有所帮助!

  

爱华网本文地址 » http://www.413yy.cn/a/25101013/167679.html

更多阅读

电脑休眠和睡眠的区别 电脑休眠和睡眠设置

电脑休眠和睡眠的区别——简介 Windows操作系统中很早就加入了待机、休眠等模式,而Windows Vista中更是新加入了一种叫做睡眠的模式,可是很多人还是习惯在不使用电脑的时候将其彻底关闭。其实充分利用这些模式,我们不仅可以节约电力消

骨瓷和陶瓷的区别 白瓷骨瓷

骨瓷和陶瓷的区别骨瓷英文名称?BoneChina?,1794年由英国人发明,是世界上公认的最高档瓷器种。骨瓷是在瓷土中加入食草动物骨粉经过高温素烧和低温釉烧两次烧制,素有薄如纸、白如玉、明如镜、声如磬的美称,色泽成天然骨粉独有的自然奶

RAM和ROM的区别 手机中ram和rom的区别

RAM和ROM的区别——简介RAM、ROM 一直是困扰不少用户的两个概念。很多手机用户不知道 RAM 和 ROM 到底有什么区别,总是一知半解,云雾缭绕。如今,小编为您解答,告诉您到底 RAM 和 ROM 有哪些区别。RAM和ROM的区别——RAM和ROM的区别RAM

EMBA和MBA的区别 托福和雅思的区别

什么是EMBA,什么是MBA,让很多朋友绕的很晕。EMBA和MBA的区别有哪些?下面就详细的介绍下,帮助广大朋友分清EMBA、MBAEMBA和MBA的区别——步骤/方法EMBA和MBA的区别 1、入学考试的不同:   在国外,如要就读MBA需参加GMAT入学考试。但就

料酒和黄酒的区别 料酒什么牌子好

料酒和黄酒的区别——简介在日常生活中,烹饪用酒统称"料酒",它包括黄酒、汾酒等。但是,市面上既有“料酒”,也有“黄酒”,而且很多人把“黄酒”叫“料酒”,又把“料酒”叫“黄酒”。那么我们在购买时应该如何选择,到底两者有什么区别呢?接下

声明:《在多线程中体会堆和栈的区别 多线程中栈与堆》为网友夏花般的女人分享!如侵犯到您的合法权益请联系我们删除