同一进程中的线程究竟共享哪些资源

线程共享的环境包括:进程代码段、进程的公有数据(利用这些共享的数据,线程很容易的实现相互之间的通讯)、进程打开的文件描述符、信号的处理器、进程的当前目录和进程用户ID与进程组ID。

 
    进程拥有这许多共性的同时,还拥有自己的个性。有了这些个性,线程才能实现并发性。这些个性包括:

    1.线程ID
      每个线程都有自己的线程ID,这个ID在本进程中是唯一的。进程用此来标识线程。
 
    2.寄存器组的值
       由于线程间是并发运行的,每个线程有自己不同的运行线索,当从一个线程切换到另一个线程上时,必须将原有的线程的寄存器集合的状态保存,以便
   将来该线程在被重新切换到时能得以恢复。
    3.线程的堆栈
       堆栈是保证线程独立运行所必须的。线程函数可以调用函数,而被调用函数中又是可以层层嵌套的,所以线程 必须拥有自己的函数堆栈,使得函数调用可以正常执行,不受其他线程的影响。

    4.错误返回码
       由于同一个进程中有很多个线程在同时运行,可能某个线程进行系统调用后设置了errno值,而在该线程还没有处理这个错误,另外一个线程就在此时
   被调度器投入运行,这样错误值就有可能被修改。
       所以,不同的线程应该拥有自己的错误返回码变量。

    5.线程的信号屏蔽码
       由于每个线程所感兴趣的信号不同,所以线程的信号屏蔽码应该由线程自己管理。但所有的线程都共享同样的信号处理器。

    6.线程的优先级
       由于线程需要像进程那样能够被调度,那么就必须要有可供调度使用的参 数,这个参数就是线程的优先级。

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

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

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

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

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

  这个问题是笔者在公司实习的时候发现的,因为当时刚刚涉及多线程程序设计,操作系统中如此简单的话题困扰笔者很久,希望可以对初涉C++多线程的读者有所帮助! 2)如果两个线程共享堆,而且都有可能执行内存分配和释放操作,就必须进行同步保护,这个和C类,R类,T类没有关系。你看到的例子两个线程应该是使用各自的堆。 

  在 windows 等平台上,不同线程缺省使用同一个堆,所以用 C 的 malloc (或者 windows 的 GlobalAlloc)分配内存的时候是使用了同步保护的。如果没有同步保护,在两个线程同时执行内存操作的时候会产生竞争条件,可能导致堆内内存管理混乱。比如两个线程分配了统一块内存地址,空闲链表指针错误等。 

  Symbian 的线程一般使用独立的堆空间。这样每个线程可以直接在自己的堆里分配和释放,可以减少同步所引入的开销。当线程退出的时候,系统直接回收线程的堆空间,线程内没有释放的内存空间也不会造成进程内的内存泄漏。 

  但是两个线程使用共用堆的时候,就必须用 critical section 或者 mutex 进行同步保护。否则程序崩溃时早晚的事。如果你的线程需要在共用堆上无规则的分配和释放任何数量和类型的对象,可以定制一个自己的 allcator,在 allocator 内部使用同步保护。线程直接使用这个 allocator 分配内存就可以了。这相当于实现自己的 malloc,free。但是更建议你重新审查一下自己的系统,因为这种情况大多数是不必要的。经过良好的设计,线程的本地堆应该能够满足大多数对象的需求。如果有某一类对象需要在共享堆上创建和共享,这种需求是比较合理的,可以在这个类的 new 和 delete 上实现共享保护。

 

转自:http://laiyuanyuan7.blog.163.com/blog/static/15274321201241191321666

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

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

相关文章

物联lot是什么意思_什么是物联网,物联网(lOT)简介

什么是物联网物联网(The Internet of Things,简称IOT)是指通过各种信息传感器、射频识别技术、全球定位系统、红外线感应器、激光扫描器等各种装置与技术,实时采集任何需要监控、 连接、互动的物体或过程,采集其声、光、热、电、力学、化 学、…

Python 位操作运算符

&按位与运算符:参与运算的两个值,如果两个相应位都为1,则该位的结果为1,否则为0(a & b) 输出结果 12 ,二进制解释: 0000 1100|按位或运算符:只要对应的二个二进位有一个为1时,结果位就为1。(a | b) 输出结果 6…

JavaOne 2016后续活动

我很高兴今年参加了JavaOne,我可以用一个词概括一下这一经验:Brilliant。 对于我来说,今年与往年相比有很大不同,因为我在周日有一个演讲要共同演讲,而我剩下的一周时间都可以参加会议。 因此,我了解到在Ja…

python对初学者的看法_python学习之道(1)——新手小白对print()函数的理解,Python,之路,一,浅谈...

Python学习之路(一) ——浅谈新手小白对print()函数的理解写在前面笔者目前为在校大四学生(某末流211),大学生活即将画上终点,然而却还没有真正精通一门语言,很是惭愧。在大学期间参加了各种文体活动,获得了很多次演讲比赛的奖项&…

理解Windows内核模式与用户模式

1、基础 运行 Windows 的计算机中的处理器有两个不同模式:“用户模式”和“内核模式”。根据处理器上运行的代码的类型,处理器在两个模式之间切换。应用程序在用户模式下运行,核心操作系统组件在内核模式下运行。多个…

判断使用设备是PC还是phone

<script type"text/javascript"> //如果是手机设备&#xff0c;则.. if(/Android|webOS|iPhone|iPod|BlackBerry/i.test(navigator.userAgent)) {window.location.href "http://www."; } </script><style type"text/css"> me…

求1+2+3+...+n

题目描述 求123...n&#xff0c;要求不能使用乘除法、for、while、if、else、switch、case等关键字及条件判断语句&#xff08;A?B:C&#xff09;。 1、根据基本公式展开&#xff0c;利用java的幂函数代替乘法&#xff0c;利用位移运算代替除法 public class Solution {pub…

1 京东_推荐好友拿好礼 | 每1积分可兑换30元京东电子卡

三季度转推介活动火热进行中该积分最终以被推荐客户9月30日金融资产余额为依据积分兑现时间为活动结束后15个工作日我行会将京东电子卡密码通过短信方式直接发送至推荐客户预留手机号码上(请推荐客户登记真实、准确的电话号码&#xff0c;否则无法兑现积分奖励)尊敬的客户&…

在cmd命令行下编译运行C/C++源文件

一直用java来写程序&#xff0c;java配置好jre路径之后&#xff0c;在cmd下编译运行&#xff0c;很方便。 刚好要给一个舍友改下C程序&#xff0c;想到可不可以像java一样在环境变量里配置好C的编译路径呢&#xff1f; 于是上网搜了一下&#xff0c;得到如下结果&#xff1a; 一…

制作程序化装饰花纹图案_用装饰器设计图案装饰

制作程序化装饰花纹图案装饰图案是广泛使用的结构图案之一。 此模式在运行时动态更改对象的功能&#xff0c;而不会影响对象的现有功能。 简而言之&#xff0c;此模式通过包装将附加功能添加到对象。 问题陈述&#xff1a; 想象一个场景&#xff0c;我们有一个比萨饼&#xff…

10停止nginx命令 win_windows版nginx快速操控神器(重启,关闭)

众所周知,Windows 版本的Nginx 是linux版本的阉割版,但是在开发或者个人测试的时候,还是非常好用的&#xff0c;但是nginx运行的命令自己敲打起来不是那么的方便,因此呢&#xff0c;我们就写了个Bat批处理小程序&#xff0c;封装了这些命令&#xff0c;2.1版本您只需要配置下 N…

学习vi和vim编辑器(8):全局替换(1)

本章学习vi编辑器中的全局替换命令。通过全局替换命令&#xff0c;可以自动替换文件中所有出现过的某个单词。全局替换一般会用到两个ex命令&#xff1a;":g"(global)&#xff0c;":s"(substitute)。 替换命令&#xff1a; 替换命令的语法如下&#xff1…

使用DynamoDBMapper查询DynamoDB项目

在上一篇文章中&#xff0c;我们使用底层Java api在DynamoDB数据库上发出了查询。 使用DynamoDBMapper进行查询非常简单。 使用哈希键发出查询非常简单。 这样的查询的最佳候选者是通过使用电子邮件哈希键进行搜索的Users表。 public User getUser(String email) {User user…

实训二—博客三

学期末总结 经过了一个学期的java学习&#xff0c;使我对java产生了很大的兴趣&#xff0c;虽然我学的并不怎么好&#xff0c;但是我喜欢程序可以成功运行时带来的成就感&#xff0c;我也享受排错的过程。学加练的上课模式我觉得也很棒&#xff0c;给了我们独立思考编程的时间&…

小肚皮最新版本_小肚皮旧版本

00后最炙手可热的社交软件《小肚皮旧版本》等你下载天&#xff0c;在这里独特的社交玩法等你感受&#xff0c;为你带来有趣的玩法乐趣&#xff0c;小肚皮旧版本中丰富的乐趣玩法等你来感受&#xff0c;让你轻松享受到更多的乐趣所在&#xff0c;为你带来不一样的社交乐趣。特色…

小心使用STL中map的[]操作符

一个map就是一个&#xff08;关键码&#xff08;key&#xff09;&#xff0c;值&#xff08;value&#xff09;&#xff09;对偶的序列&#xff0c;它提供基于关键码的快速提取操作。也就是说&#xff0c;可以用下标运算符[]将关键码作为下标去执行查找&#xff0c;并返回对应的…

存图

转载于:https://www.cnblogs.com/simple-huang/p/10183360.html

地平线机器人_地平线机器人CEO余凯:基于深度学习的自动驾驶之路

请关注公众号“汽车创新港”&#xff0c;获取后续更多论坛实录&#xff01;加工作人员微信号&#xff1a;tinydanio&#xff0c;备注“我要入群”直接进入直播群&#xff01;今天都是大牛&#xff0c;下面的也是技术大牛&#xff0c;是百度深度学习实验室创始人&#xff0c;百度…

Mac os下android studio模拟器无法联网解决方法

步骤1: https://blog.csdn.net/qq_33945246/article/details/79908298 步骤2: 访达进入/Users/文件夹 步骤3: shiftcmmand.显示隐藏文件夹 步骤4 打开.android文件夹 点击adv文件夹进入&#xff0c;然后回到 "步骤1"查看解决方法 本人创业做的一款androidApp, 下载量…

matlab中表示拉普拉斯分布_深度优化局部拉普拉斯金字塔滤波器。

微信公众号&#xff1a;OpenCV学堂关注获取更多计算机视觉与深度学习知识觉得文章有用&#xff0c;请戳底部【好看】支持算法概述基于局部拉普拉斯金字塔的Edge-aware滤波器是在2011年由Adobe 公司的研究员Sylvain Paris(大神级人物&#xff0c;写了很多文章)提出的&#xff0c…