OS进程同步实验报告 下载本文

内容发布更新时间 : 2024/11/8 14:40:05星期一 下面是文章的全部内容请认真阅读。

学 号 实验名称 实验目的: 1. 在本实验中,通过对线程创建、改变线程优先级及线程的启动与停止等方法的了解,来加深对Windows 2000线程控制与管理的理解。 2. 在本实验中,通过对临界区,互斥体和信号量的使用,来加深对Windows 2000线程同步的理解。 2016143222 姓名 王娟 实验日期 2018.4.20 线程的执行与同步 实验内容: 1. 2. 运行程序3-1、3-2,并对运行结果进行分析。 运行程序4-1、4-2、4-3、4-4,并对运行结果进行分析。 实验原理: 线程之间以并发(注意不是并行,并行是互相毫不相干的各自同时执行)方式执行。但是由于多线程往往拥有共同的临界资源,比如打印机,全局变量,控制台等。这种资源一次只允许一个线程访问和使用(互斥)。使得多线程必须要按照一定的次序串行执行(同步)共享资源。在各个线程中使用、操作共享资源的代码段叫临界区。 信号量是一种数据结构,一般由两个成员组成:数值、指针。一般来说,信号量的值代表着当前资源的使用情况,信号量的值只能由P、V操作来改变,不同的信号量可以实现不同场景下的线程同步,但是都是由P、V操作来实现。 P、V操作都是原子操作;P申请一个单位资源,申请不到就等待;V释放一个单位资源,如果有等待线程就唤醒 P操作:P(S) --S 如果S<0,等待;如果S>=0,继续 V操作:V(S) ++S 如果S>0,继续;如果S<=0,唤醒 根据P、V操作中使用的变量个数和大小,可以实现多种线程同步的场景:互斥体、信号量、读写锁等。这些同步工具都有类似的接口,如获取(acquire)、释放(release)等。

实验过程与结果: 1. 程序3_1. #include #include #include DWORD WINAPI Threada(LPVOID lpPara) { cout<<\//④ExitThread(2); for(int n=0;n<10;n++) { cout<<\ //① Sleep(100); } return(0); } void main() { HANDLE ha; cout<<\ ha=CreateThread(NULL, //默认的安全属性,不继承该线程句柄 0, // 由系统设置默认大小的堆栈 Threada, //入口函数 NULL, //函数参数指针 0, //启动选项 NULL); //返回线程ID //②SuspendThread(ha); //②cout<<\//⑤TerminateThread(ha,0); cout<<\ for(int n=0;n<10;n++) { cout<<\ //① Sleep(500); } //②ResumeThread(ha); //③WaitForSingleObject(ha,INFINITE);//用10代替 INFINITE } 依次执行各标号语句,分析执行的结果。 1、 sleep(500);程序停半秒,然后继续向下执行。 2、SuspendThread(ha);暂停ha线程 ResumeThread(ha);启动被挂起的ha线程,恢复线程运行 3.WaitForSingleObject线程一直被挂起,直到ha所指向的对象变为有信号状态时为止 4、ExitThread:指定调用线程的退出代码 在一个过程中,某一时刻只有一个线程可以在一个动态链接库的初始化或分离程序。 5.TerminateThread在线程外终止一个线程,用于强制终止线程 2. 程序3_2 #include #include #include class CWorkerThread {public: CWorkerThread(LPCTSTR szName): m_szName(szName),m_hThread(INVALID_HANDLE_VALUE) { m_hThread=CreateThread( NULL,0,ThreadProc,reinterpret_cast(this),0,NULL); } virtual ~CWorkerThread(){CloseHandle(m_hThread);} virtual void WaitForCompletion() { WaitForSingleObject(m_hThread,INFINITE);}