实验2 线程同步机制_第1页
实验2 线程同步机制_第2页
实验2 线程同步机制_第3页
实验2 线程同步机制_第4页
实验2 线程同步机制_第5页
已阅读5页,还剩8页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

实验2线程同步机制一、实验目的:通过观察共享数据资源但不受控制的两个线程的并发运行输出结果,体会同步机制的必要性和重要性。然后利用现有操作系统提供的同步机制编程实现关于该两个线程的有序控制,同时要求根据同步机制的彼得森软件解决方案尝试自己编程实现同步机制和用于同一问题的解决,并基于程序运行时间长短比较两种同步机制。二、实验设计i基于给定银行账户间转账操作模拟代码作为线程执行代码,在主线程中创建两个并发线程,编程实现并观察程序运行结果和予以解释说明。二利用窗子互斥信号量操作函数解决上述线程并发问题,并分析、尝试和讨论线程执行体中有关信号量操作函数调用的正确位置。三根据同步机制的彼得森软件解决方案尝试自己编程实现线程同步机制和用于上述线程并发问题的解决,并基于程序运行时间长短将其与基于窗子互斥信号量的线程同步机制的效率展开比较。其间,可规定线程主体代码循环执行次三、源程序清单和说明1未利用互斥信号量#包括#包括#包括整数1=0,整数2=0;int Nloop=0;整数1,整数2,整数;DWORD WINAPI线程函数(句柄线程)做nTemp1=nAccount1nTemp2=nAccount2nRandom=rand();nAccount1=整数1随机;NAC count 2=nTEMP2-nRandom;无回路。而(NAC计数1 NAC计数2)=0);printf(循环次数为%dn ,nLoop);返回0;int main()手柄螺纹2;线程0=创建线程(空,0,线程函数,空,0,空);线程1=创建线程(空,0,线程函数,空,0,空);等待多重对象(2、线程,真,无限);关闭手柄(螺纹);返回0;2利用窗子互斥信号量#包括#包括#包括#定义计数1000000整数1=0,整数2=0;处理互斥。DWORD WINAPI线程函数(句柄线程)int Nloop=0;整数1,整数2,整数;WaitForSingleObject(互斥体,无限);做nTemp1=nAccount1nTemp2=nAccount2nRandom=rand();nAccount1=整数1随机;NAC count 2=nTEMP2-nRandom;无回路。释放互斥体(互斥);WaitForSingleObject(互斥体,无限);而(NAC计数1 NAC计数2)=0循环计数);释放互斥体(互斥);WaitForSingleObject(互斥体,无限);printf(循环次数为%dn ,nLoop);释放互斥体(互斥);返回0;int main()手柄螺纹2;双字开始,结束;start=GettickCount();互斥体=创建互斥体(空、假、空);线程0=创建线程(空,0,线程函数,空,0,空);线程1=创建线程(空,0,线程函数,空,0,空);等待多重对象(2、线程,真,无限);end=GettickCount();printf(总共用时%ldn ,结束-开始);关闭手柄(螺纹);关闭句柄(互斥);返回0;3同步机制的彼得森#包括#包括#包括#定义计数1000000整数1=0,整数2=0,标志2,转向;int Nloop=0;整数1,整数2,整数;/HANDLE互斥体;无效请求(int id)int other=1-id;标志id=1;转弯=其他;而(flagother=1 turn=other) ;DWORD WINAPI线程函数0(句柄线程)请求(0);做nTemp1=nAccount1nTemp2=nAccount2nRandom=rand();nAccount1=整数1随机;NAC count 2=nTEMP2-nRandom;无回路。标志0=0;请求(0);而(NAC计数1 NAC计数2)=0 nLoop计数);标志0=0;请求(0);标志0=0;printf(循环次数为%dn ,nLoop);返回0;DWORD WINAPI线程函数1(句柄线程)请求(1);做nTemp1=nAccount1nTemp2=nAccount2nRandom=rand();nAccount1=整数1随机;NAC count 2=nTEMP2-nRandom;无回路。标志1=0;请求(1);而(NAC计数1 NAC计数2)=0 nLoop计数);标志1=0;请求(1);标志1=0;printf(循环次数为%dn ,nLoop);返回0;int main()手柄螺纹2;双字开始,结束;start=GettickCount();线程0=创建线程(空,0,线程函数0,空,0,空);线程1=创建线程(空,0,线程函数1,空,0,空);等待多重对象(2,线程,真,无限);end=GettickCount();Printf(“总运行时间%ldn”,结束-开始);关闭手柄(螺纹);返回0;四、算法和关键数据结构设计1.银行账户间转账操作模拟整数1=0,整数2=0;/由主线程序创建的全局变量int Nloop=0;整数1,整数2,整数;做nTemp1=nAccount1nTemp2=nAccount2nRandom=rand();nAccount1=nTemp1随机;naccount 2=nTEMP2-nRandom;无回路。而(NAC count 1 NAC count 2)=0);Printf(“周期数%dn”,nLoop);2.进程互斥算法1设置访问号Var turn:整数:=I;重复而芜菁不做任何操作;临界面积turn :=j;直到错误;3.进程互斥算法2设置访问标志Var flagi,flagj:布尔值:=false,false。重复而flagj不执行任何操作;flagi :=真;临界面积flagi :=false直到错误;4.进程互斥算法3设置访问标志Var flagi,flagj:布尔值:=false,false。重复flagi :=真;而flagj不执行任何操作;临界面积flagi :=false直到错误;5.进程互斥算法4号标志Var flagi,flagj:布尔值;turn:整数;重复flagi :=真;转弯:=j;而(flagj和turn=j)不执行任何操作;临界面积flagi :=false直到错误;V.实验过程中间结果截图实验结果1互斥信号量未使用2使用视窗互斥信号量3同步机制的彼得森结果分析1没有互斥体同时应用于控制线程,这将导致错误。2在使用了Windows互斥体之后,两个访问线程可以正确地并发执行。10万次成功转账。但是它增加了系统的时间成本。时间效率低。3应用同步机制的Peterson算法后,两个线程可以并发执行并成功传输10万个事务,但与Windows互斥体相比,时间明显缩短。提高了系统的运行时间和时间效率。六、难以解决的疑惑和吸取的教训通过该实验,实现了两个线程的并发运行。对于共享数据资源但不受控制的两个线程的并发操作,将会出现错误结果。因此,同步

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论