文档详情

进程同步实验.docx

发布:2016-11-28约字共15页下载文档
文本预览下载声明
实验一 线程同步计科1304班梁玮实验目的通过观察计算机运行时线程的同步执行,进而在实践中加深对线程同步的理解。实验内容本次实验旨在产生一种多线程执行时的矛盾问题,并寻找方法解决这个问题。为了产生矛盾,首先要建立两个操作相同的线程,并且让它们同时访问两个全局变量accnt1和accnt2,每次访问都给accnt1和accnt2分别加上和减去相同的数,最后在将accnt1和accnt2求和,观察两个账户的余额之和将永远是0。线程一旦检测到混乱的发生,便终止循环并打印交易的次数(counter)。实验步骤问题提出——不采取任何措施#include stdio.h#include stdlib.h#include windows.hint accnt1 = 0;int accnt2 = 0;DWORD WINAPI run(LPVOID p){int counter = 0;int tmp1,tmp2,r;int id = (int)p;do{r = rand();tmp1 = accnt1;accnt1 = tmp1 + r; tmp2 = accnt2;accnt2 = tmp2 - r;counter++;}while(accnt1 + accnt2 == 0);printf(线程%u结束,转账次数:%d,accnt1=%d,accnt2=%d\n,id,counter,accnt1,accnt2);return 0;}int main(int argc, char* argv[]){CreateThread(NULL,0,run,(LPVOID)1,0,NULL);CreateThread(NULL,0,run,(LPVOID)2,0,NULL);system(PAUSE);return 0;}我们可以看到实验结果如下图所示(如没有特殊更改,main函数不再写出):在不引入任何的措施时,不同的进程运行之间发成了交叉,一个进程A读取了一新(accnt1)一旧(accnt2,即另一个进程B同时在运行,先于进程A更新accnt1而未尚未更新的数据accnt2)两个数据导致结果发生了混乱,此时数据并没有收到影响,进程A发生错误,而进程B在没有其他进程干扰的情况下继续运行,程序在确保进程B顺利运行的情况下,输出请按任意键继续;亦可能发生在一个进程A刚刚更新完accnt1时,进程B立即对accnt1和accnt2进行了更新,这之后进程A才开始更新accnt2,此时accnt1和accnt2的数据都发生错误混乱,进程A、B也都错误。在这里我们可以看到,accnt1和accnt2作为两个被多个进程同时访问的数据,在没有任何保护存取操作的情况下被多次调用并修改,则可能会产生混乱,下面我们将引入几种方法来解决这种混乱。实验已经显示,并发线程访问共享数据时必须有同步机制的互斥保护。我们首先看一看能否在不使用信号量的情况下,制造出一种“灵巧”的互斥机制,实现对临界区的保护。在开始之前,首先明确一下对这种机制的要求:互斥:如果进程P已经进入临界区,在P退出临界区之前,不允许其他任何进程进入。空闲让进:如果当前没有进程进入临界区,那么当某进程试图进入时,应当允许其进入。有限等待:如果进程P试图进入临界区,但临界区中已经有活动进程,那么P应该等待,但等待时间必须是有限的。问题探索——busy标志#include stdio.h#include stdlib.h#include windows.hint accnt1 = 0;int accnt2 = 0;int volatile busy = 0;DWORD WINAPI run(LPVOID p){int counter = 0;int tmp1,tmp2,r;int id = (int)p;do{while(busy != 0);busy = 1;r = rand();tmp1 = accnt1;accnt1 = tmp1 + r; tmp2 = accnt2;accnt2 = tmp2 - r;counter++;busy = 0;}while(accnt1 + accnt2 == 0);printf(线程%u结束,转账次数:%d,accnt1=%d,accnt2=%d\n,id,counter,accnt1,accnt2);return 0;}上面的代码使用busy 标识当前是否有进程进入临界区。进程进入临界区时设置该标志,退出临界区时清除该标志。实验结果如下:我们可以看到,这种busy标志的方法是错误的,因为在对共用资源的调用修改过程中,我们只是对资源进行的保护并不够完善,另一个进程B一直在等待busy标志的变化,一旦变化,进程立即开始执行,而此时进程A可能还没有退出临界区,
显示全部
相似文档