code link: 欢迎star
文章目录
1. 实验目的
探索、理解并掌握操作系统同步机制的设计和实现机理,针对所谓的银行账户转账同步问题,构建基于Peterson 算法的同步解决方案以及基于Windows(或Linux)操作系统同步机制(主要是互斥机制)的解决方案,并进行分析和比较。
2. 实验内容
针对所谓的银行账户转账同步问题,分析、设计和利用C 语言编程实现基于Peterson 算法的同步解决方案,以及基于Windows(或Linux)操作系统同步机制的相应解决方案,并就自编同步机制与操作系统自身同步机制的效率进行比较和分析。
3. 实验要求
同步机制及应用编程实现与比较实验功能设计要求:
- 银行账户转账同步问题的抽象及未采取同步控制情况下的编程实现;
- 基于Peterson 算法的银行账户转账同步问题解决方案;
- 基于 Windows(或 Linux)操作系统同步机制的银行账户转账同步问题解决方案;
- Peterson 算法同步机制和Windows(或Linux)操作系统同步机制的效率比较。
4. 实验思路
实验共分为三个部分。
- 第一部分,不采用同步控制机制,只在主进程申请两个银行账户的线程来实现对比。这里的核心算法参考实验指导书。
- 第二部分,采用Peterson算法进行同步。这里参考了ppt上的介绍,需要定义两个账户两个线程函数。同时添加NLoop上限值进行控制。在这部分,利用编号和标志实现线程的互斥。
- 第三部分,采用windows系统的互斥信号量进行同步线程。主要运用参考了实验指导上的函数,包括WaitForSingleObject、ReleaseMutex、CreateMutex。这里我们通过对上边两个部分的总结,将交互输出改为1000个循环一次,这样可以在一屏上输出结果,实验验证性好。
第四部分,在peterson和windows mutex代码中加入了计时部分,还修改了主线程等待机制,使计时更加准确。控制循环变量,令两者可以比较,MAXNLOOP设为10000次。
5. 程序实现
5.1. 相关环境介绍
操作系统:window 10 21H2
开发环境:Clion-2022.2.1-Windows
编译器:mwing-10.0
5.2. 实验第一部分 无同步机制
01:DWORD WINAPI ThreadExecuteZZW(LPVOID lpParameter){
02: int *pID = (int*)lpParameter;
03:
04: int nLoop = 0;
05: int nTemp1, nTemp2, nRandom;
06: do
07: {
08: cout << "thread " << *pID << " is called"<< " nLoop is " << nLoop << endl;
09: nRandom = rand();
10: nTemp1 = nAccount1;
11: nTemp2 = nAccount2;
12: nAccount1 = nTemp1 + nRandom;
13: nAccount2 = nTemp2 - nRandom;
14: ++nLoop;
15: } while ((nAccount1 + nAccount2) == 0);
16:
17: return 0;
<