作业3-线程实现加减乘除.docVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
作业3-线程实现加减乘除

电 子 科 技 大 学 作 业 报 告 学生姓名: 学 号: 指导教师: 学生E-mail: 一、作业名称 线程实现加减乘除服务 二、作业要求 试验要求: 使用多个队列,每一个计算线程有独立的队列用于存储计算请求,请求线程可用一个队列用于接收结果。 只需要实现A(+,-,X,/)B简单两元计算 请求线程与计算线程是多对多关系 三、设计与实现 3.1设计方案 根据试验要求,线程间的通信用队列,所以通信结构就不用考虑了,提到队列,我们就要做初始化队列,朝队列里面添加信息,从队列头部取走信息这些工作,但是在队列的操作中,最重要的就是线程的同步问题了,我选择了一个互斥锁和一个条件变量相结合的方法,互斥锁保证对队列的任何操作必须唯一,条件变量使我们可以放心的等待队列有内容,接着我们就需要选择我们的整体结构了。 最开始,我考虑用一个队列,发送线程把计算式结构体放到这个队列里面,这个计算式结构体里面包括接收线程的ID号,每个接收线程轮流去读取队列,但是只能读取接受进程是自己的结构体,然后再把这些结果都返回给主线程,主线程对这个计算式进行打印到屏幕,但是这个模型有一定的限制,那就是接受计算线程个数每次去取得互斥锁,并准备去取计算式,发现这个结构体里面的接受线程不是自己,不得不释放互斥锁,轮流这样做,这样的效率会比较低。 由于计算类型是确定的,经过综合考虑,我觉得还是初始化四个发送队列,每个计算线程(加,减,乘,除)各对应一个队列,发送线程会根据自己产生的计算式类型,把这个结构体放入对应的队列中,这样接收线程在队列不空的情况下,就可以去取,并且保证可以取到,同时初始化四个回传队列,计算线程计算完毕后,把结果回传个产生这个计算式的线程。这样虽然会占有一定的空间,但是对于充足的内存,空间换时间的做法还是可以选择的。 在最后选择进程结束时,我考虑的是计算线程不能退出,因为暂时队列为空,不代表没有了该类型的计算式,但是还要保证最后整个线程正常退出,只能让所有的发送线程在接收到各自全部的计算式后返回主线程,这样主线程根据返回的发送线程的个数来判断是否结束整个进程。 另外发送线程的个数以及每个发送线程发送多少个计算式作业,都是用宏定义定义的,只要改变这两个值就可以修改线程的个数和现成的作业数,我这里主要的思想还是想把加减乘除与0,1,2,3对应起来,这样可以保证四个发送队列的类型与加减乘除匹配起来,并且计算线程id数组的下标刚好也用0,1,2,3与加减乘除对应,这样可以简单好理解。 结构图1 这里只是大体的模型,下面会详细说明中间的细节。 3.2模块分析 根据我自己的代码分析,我大概分了初始化队列,队尾插入,对头移除,计算式产生,计算,输出这六个模块,模块图如下: 模块图2 3.3流程介绍 从主程序开始,首先主线程初始化发送队列,发送队列主要分为四种类型,加法发送队列,减法发送队列,乘法发送队列,除法发送队列,接着会初始化N个回传队列,这个N的个数与发送线程的个数保持一致,都有代码开始的宏定义定义,然后根据宏定义N产生N个子线程,开始发送子线程的工作,同时也要产生四个计算子线程,分别对应于加法计算,减法计算,乘法计算,除法计算,他们从对应的发送队列中取出要计算的计算式,并把他们计算出来,再根据这个计算式是由哪个发送线程产生的,把计算结果回送给那个发送进程,发送进程把这个计算式打印出来,并返回主线程,主线程当所有发送线程都返回时,就退出这个进程,到此为止,主进程结束,先画出大概的流程图,在详细画出发送线程和计算线程各自的流程图。 主线程的流程图3 对于发送线程,首先通过一个函数产生两个一定范围的随机数,并产生一个加减乘除的符号,并判断当符号为除号时,除数是否为零,若为零,则重新产生两个数字作为除数与被除数,然后根据运算符号把自己产生的计算式结构体插入在相对应队列的尾部,插入的过程需要保证取得互斥锁,这样可以保证线程的同步,当自己产生JNUM个作业后,这些发送线程就要在属于自己的回传队列上等待接受计算过的计算式,并打印到屏幕,当线程接收到自己发送的所有计算作业后,就要返回到主线程。 发送线程的流程图4 对于计算线程,由于我这里各个计算线程要执行的函数是同一个函数,所以这些计算线程开始要确定自己线程id在线程id数组中的下标,下标0,1,2,3分别对应于加,减乘,除,如果一个线程对应的下标是0,则表示这个线程要执行加法计算,并根据这个下标,去发送队列中取出一个计算作业,这是不仅要取得队列的互斥锁,而且还要等待条件变量,这个条件变量只是为了保证这个队列不空,才能使计算线程能成功取得该作业,取得一个作业后,进行相应的计算,然后把该计算结果放到发送线程对应的回传队列中,就这样一直循环,知道主线程退出,它就自动退出了。 计算线程的流

文档评论(0)

kaiss + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档