1、4、实验设计:本实验包含三个基于并发线程的程序,第一个没有同步机制,第二个利用Win32 API中互斥信号量操作函数解决线程并发问题,第三个根据同步机制的Peterson软件解决方案实现线程同步机制并解决线程并发问题。三个程序拥有相同的线程主体:线程主体设计:do nTemp1 = nAccount1; nTemp2 = nAccount2; nRandom = rand(); nAccount1 = nTemp1 + nRandom; nAccount2 = nTemp2 - nRandom; nLoop+; while (nAccount1 + nAccount2)=0);该线程主体是对银
2、行账户间转账操作模拟的模拟,可知,若并发的线程不发生交叉,则依次转账操作后nAccount1 + nAccount2的值永远为0,程序不会跳出循环,如果线程发生交叉,则经过若干次转账操作后,就有可能出现nAccount1 + nAccount2不为0的情况,此时程序跳出循环。本实验的三个程序就是基于此线程主体逐步实现的。同步机制的Peterson软件解决方案5、数据结构设计:程序一:没有同步机制说明:ThreadFunc(HANDLE Thread)为线程函数;nAccount1、aAccount2模拟账户;nLoop记录循环次数;nRandom是产生的随机数模拟转账金额;nTemp1、nTe
3、mp2用于暂存nAccount1、aAccount2;HANDLE Thread2创建两个线程句柄。程序二:利用Win32 API中互斥信号量mutex为互斥信号量;time_start、time_end为线程开始运行和结束的时间;time=time_end- time_start。程序三:同步机制的Peterson软件解决方案flag为长度为2的bool型数组,turn为整型,flag与turn共同实现同步机制的Peterson软件解决方案;nLoop1记录线程0的循环次数;nLoop记录线程1的循环次数。6、算法流程图:7、实验过程结果截图:8、实验结果分析:第一个程序两个线程并发并没有同
4、步机制,所以产生了nAccount1 + nAccount2不为0的情况,程序跳出循环,一个线程结束,但剩余的一个线程自己是无法跳出循环的,所以程序一直在运行;第二个程序利用互斥信号并通过成功资源资源来解决并发带来的混乱;第三个程序通过同步机制的Peterson软件解决方案解决并发带来的混乱;通过结果可知,同步机制的Peterson软件解决方案的效率要高于利用Win32 API中互斥信号量的方法。9、实验总结:实验心得:通过本次实验,我锻炼里自己的编程能力,并对理论知识有了进一步的理解。对线程并发问题有了进一步的体会,并掌握了同步线程的方法,特别是同步机制的Peterson软件解决方案。同时我
5、也体会到,学好这门课程,不光要掌握好理论,更重要的是要多实践,对实验现象多加分析研究,才会融会贯通所学的容。实验评价:本实验按照实验指导书完成了要求的全部容,成功得出了结果。但实验程序也存在一些潜在的漏洞,比如第三个程序在多次执行中会出现总的循环次数不为1000000的情况,有待进一步完善。10、实验程序清单:#include #includestdlib.hiostreamusing namespace std;int nAccount1=0, nAccount2=0; int nLoop=0;int nTemp1,nTemp2,nRandom;DWORD WINAPI ThreadFunc
6、(HANDLE Thread) do printf(循环次数为%dn, nLoop); return 0;int main() HANDLE Thread2; Thread0=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL); Thread1=CreateThread(NULL,0,ThreadFunc,NULL,0,NULL); WaitForMultipleObjects(2,Thread,TRUE,INFINITE); CloseHandle(Thread);#define COUNT 1000000int nAccount1 = 0, nAccou
7、nt2 = 0;int nLoop = 0;int nTemp1, nTemp2, nRandom;HANDLE mutex;DWORD WINAPI ThreadFunc(LPVOID lpParamter) WaitForSingleObject(mutex,INFINITE); do ReleaseMutex(mutex); WaitForSingleObject(mutex,INFINITE); while (nAccount1+nAccount2 = 0 & nLoopCOUNT); ReleaseMutex(mutex);int main() long time; DWORD ti
8、me_start, time_end; time_start = GetTickCount(); mutex = CreateMutex(NULL,FALSE,screen); Thread0 = CreateThread(NULL,0,ThreadFunc,NULL,0,NULL); Thread1 = CreateThread(NULL,0,ThreadFunc,NULL,0,NULL); CloseHandle(mutex); time_end = GetTickCount(); time=time_end-time_start; cout总共用时:timemsendl;int nAcc
9、ount1=0,nAccount2=0;int nLoop1 = 0;int nLoop2 = 0;int nTemp1=0,nTemp2=0,nRandom;bool flag2;int turn;DWORD WINAPI ThreadFunc0(HANDLE Thread) flag0=true; /这三行是模拟互斥信号量申请 turn=1; while(flag1 & turn=1) nLoop1+; flag0=false; /释放资源 flag0=true; turn=1; while(flag1 & while(nAccount1+nAccount2)=0 & (nLoop1+nL
10、oop2)COUNT );1循环次数为:nLoop1 flag0=false;DWORD WINAPI ThreadFunc1(HANDLE Thread) flag1=true; /这三行是模拟互斥信号量申请 turn=0; while(flag0 & turn=0) nTemp1=nAccount1; nTemp2=nAccount2; nLoop2+; flag1=false; /释放资源 flag1=true; /这三行是模拟互斥信号量申请 turn=0; while(flag0 & 2循环次数为:nLoop2 flag1=false; Thread0 = CreateThread(NULL,0,ThreadFunc0,NULL,0,NULL); Thread1 = CreateThread(NULL,0,ThreadFunc1,NULL,0,NULL);总次数:nLoop1+nLoop2
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1