《操作系统实验指南》进程(线程)同步及死锁_第1页
《操作系统实验指南》进程(线程)同步及死锁_第2页
《操作系统实验指南》进程(线程)同步及死锁_第3页
《操作系统实验指南》进程(线程)同步及死锁_第4页
《操作系统实验指南》进程(线程)同步及死锁_第5页
已阅读5页,还剩5页未读 继续免费阅读

下载本文档

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

文档简介

操作系统实验指南实验二 进程(线程)同步及死锁一、实验目的在多进程(线程)运行环境中,进程(线程)之间并发执行,如果对进程(线程)访问临界资源(如公共变量)的操作不加限制,就会产生“与时间有关”的错误。为防止这类错误,必须用同步机构控制进程(线程)对临界资源(公共变量)的访问。在一个进程(线程)需要两个或两个以上的临界资源时,如果申请和推进顺序不当,会造成死锁,即多个进程(线程)因竞争临界资源而造成的一种僵局,若无外力作用,这些进程(线程)都将永远不能再向前执行。本实验利用 Windows 系统提供的同步机制,来协调线程(Thread)间的并发执行,并比较各种预防死锁的措施,以加深对同步机制和死锁的理解,并学会在并发程序中引用同步机构,并预防死锁的编程方法。二、实验要求熟悉 Windows 操作系统及 VC+程序设计方法三、实验内容设计解决哲学家就餐问题的并发线程。假定有 6 个哲学家,围着圆桌交替地进行思考和进餐;每次进餐时,必须同时拿到左右两边的两只筷子才能进餐;进餐后,再放下筷子继续思考。这是一个典型的同时需要两个资源的例子,如果申请资源顺序不当,可能会引起死锁。本实验设计 6 个哲学家共享一个相同的线程 Philosopher,既完成线程同步,又预防死锁发生。实验中采用了 3 种预防死锁的方法(摒弃环路等待条件,摒弃请求和保持条件,摒弃不剥夺条件) ,要预防死锁,只采用其中的任何一种方法即可。四、Windows 及 VC+并发线程同步机制程序设计简介1、Windows 线程简介在 Windows 环境下,一个进程(即一个执行文件*.exe)可以同时包含多个线程,每个线程是一个分配 CPU 和独立执行的单位,线程可并发执行,但在访问同类临界资源的线程之间,必须采用同步机制,实现对临界资源(如公共缓冲区)的同步访问。2、VC+并发线程设计简介、创建线程采用 CreateThread(LPSECURITY_ATTRIBUTES lpThreadAttributes, / 线程安全属性DWORD dwStackSize, / 堆栈大小LPTHREAD_START_ROUTINE lpStartAddress, / 线程启动函数LPVIOD lpParameter, / 线程函数参数DWORD dwCreationFlags, / 线程创建属性LPDWORD lpThreadId); / 线程标识函数可创建一个线程。最简洁地创建线程形式为:hThread = CreateThread(NULL, 0, (LPTHREAD_START_ROUTINE) ThreadName, NULL, 0, 该形式只给出创建的线程名(ThreadName)和返回值( ThreadID) ,其余值皆为默认值。、创建信号量采用 CreateSemaphore(LPSECURITY_ATTRIBUTES lpsa, / 安全属性LONG lInitialCount, / 初始值LONG lMaxCount, / 最大值LPTSTR lpszSemName); / 信号量名创建一般信号量最简洁方式为:(hSemaphore 为一般信号量句柄)hSemaphore = CreateSemaphore(NULL, 0, MAXCOUNT-1, NULL);、等待信号量和发送信号量等待信号量同样采用 WaitForInputIdle ()函数,可以用以下形式:WaitForSingleObject(hSemaphore, INFINITE);发送信号量:采用 ReleaseSemaphore(HANDLE hSemaphore, / 信号量句柄LONG lRelease, / 发信号量数LPLONG lplPrevious); / 前次信号量值发送一般信号量最简洁方式为:ReleaseSemaphore(hSemaphore, 1, NULL);、摒弃环路等待条件使至少有一位哲学家拿筷子的顺序与其它哲学家不同。本实验设计第 0 个哲学家从右边拿筷子,而其它哲学家从左边拿筷子。程序实现如下:if (ThreadID = 0) R1 = (ThreadID+1) % 6;R2 = ThreadID;、摒弃请求和保持条件使哲学家同时拿到两只筷子,否则,一只筷子也不拿。程序实现如下:Wait(Mutex);if (ChopstickUsedR1) | (ChopstickUsedR2) Signal(Mutex);goto LoopAgain;Signal(Mutex);、摒弃不剥夺条件如果哲学家不能拿到第二只筷子,则第一只筷子也放弃掉。程序实现如下:Wait(Mutex);if (ChopstickUsedR2) Signal(Mutex);goto ReleaseChopstick;Signal(Mutex);HWND hWind;HDC hWDC;void InitThreadSemaphore(void);void DrawPhilosopher(void);/-/ DWORD FAR PASCAL InitThreadSemaphore()/ Description:/ Window 主函数/-LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)int wmId, wmEvent;PAINTSTRUCT ps;HDC hdc;TCHAR szHelloMAX_LOADSTRING;LoadString(hInst, IDS_HELLO, szHello, MAX_LOADSTRING);switch (message) case WM_CREATE:hWind = hWnd;hWDC = GetDC(hWnd);break;case WM_COMMAND:wmId = LOWORD(wParam); wmEvent = HIWORD(wParam); / Parse the menu selections:switch (wmId)case IDM_EAT:InitThreadSemaphore();break;case IDM_EXIT:ReleaseDC(hWnd, hWDC);DestroyWindow(hWnd);break;default:return DefWindowProc(hWnd, message, wParam, lParam);break;case WM_PAINT:hdc = BeginPaint(hWnd, / TODO: Add any drawing code here.RECT rt;GetClientRect(hWnd, DrawPhilosopher();EndPaint(hWnd, break;case WM_DESTROY:PostQuitMessage(0);break;default:return DefWindowProc(hWnd, message, wParam, lParam);return 0;HANDLE Mutex; / 互斥信号量HANDLE ChopStick6; / 筷子信号量BOOL ChopstickUsed6; / 筷子已被其它线程申请并保持DWORD PhilosopherID6; / 哲学家线程标识符HANDLE tPhilosopher6; / 哲学家线程句柄RECT PRect6 = 350, 100, 380, 130, 650, 100, 680, 130, 800, 310, 830, 340, 650, 520, 680, 550, 350, 520, 380, 550, 200, 310, 230, 340;HBRUSH hBrush7; / 红、绿、蓝、黄、白色刷子POINT CPolygon64 = 210, 177, 290, 217, 284, 226, 204, 186,510, 50, 520, 50, 520, 130, 510, 130,724, 217, 804, 177, 810, 185, 730, 225,730, 427, 810, 467, 804, 476, 724, 436,510, 520, 520, 520, 520, 600, 510, 600,204, 467, 284, 427, 290, 435, 210, 475;DWORD FAR PASCAL Philosopher(LPVOID); / 哲学家线程void Wait(HANDLE); / 等待信号量void Signal(HANDLE); / 发送信号量void DrawChopstick(HBRUSH, int, BOOL); / 用对应颜色刷子画筷子/ 并设置/取消使用标记void WaitTime(int);/-/ DWORD FAR PASCAL InitThreadSemaphore()/ Description:/ 生成哲学家线程及各种信号量和变量初始化/-void InitThreadSemaphore()int i;hBrush0 = CreateSolidBrush(RGB(255, 0, 0 ); / 红色刷子hBrush1 = CreateSolidBrush(RGB( 0, 255, 0 ); / 绿色刷子hBrush2 = CreateSolidBrush(RGB( 0, 0, 255); / 蓝色刷子hBrush3 = CreateSolidBrush(RGB(255, 255, 0 ); / 黄色刷子hBrush4 = CreateSolidBrush(RGB( 0, 255, 255); / 青色刷子hBrush5 = CreateSolidBrush(RGB(255, 0, 255); / 棕色刷子hBrush6 = CreateSolidBrush(RGB(255, 255, 255); / 白色刷子DrawPhilosopher();for (i=0; i10000) Loop = 0;return(0);/-/ DWORD FAR PASCAL Philosopher4()/ Description:/ 画筷子线程/-void DrawChopstick(HBRUSH hChopstickBrush, int ChopstickID, BOOL ChopstickUsedID)Wait(Mutex);if (ChopstickUsedID) ChopstickUsedChopstickID = TRUE; / 设置筷子已使用标志SelectObject(hWDC, hChopstickBrush);Polygon(hWDC, CPolygonChopstickID, 4);else ChopstickUsedChopstickID = FALSE; / 取消筷子已使用标志SelectObject(hWDC, hChopstickBrush);Polygon(hWDC, CPolygonChopstickID, 4);Signal(Mutex);/-/ void WaitTime()/ Description:/ 延迟器(单位 ms)/-void WaitTime(int msTime)int

温馨提示

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

评论

0/150

提交评论