- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
多线程的调度
实验二 多线程的调度 实验目的 1、掌握多线程编程的特点。 2、重点掌握实时多任务的同步问题。 二、实验原理 1、多线程的概念 多线程就是指:一个进程内可以有多个可执行的单元,每个单元就是一个线程,它包含独立的堆栈和寄存器状态,每个线程共享所有的进程资源,包括打开的文件、信号标识及动态分配的内存等等。一个进程内的所有线程使用同一个位地址空间,而这些线程的执行由系统调度程序控制,调度程序决定哪个线程可执行以及什么时候执行线程。线程有优先级别, 优先权较低的线程必须等到优先权较高的线程执行完任务后再执行。在多处理器的机器上,调度程序可将多个线程放到不同的处理器上运行。这样就可使处理器的任务平衡,也提高了系统的运行效率。一般来说,一个进程至少包括一个线程,通常将该线程称为主线程。一个进程从主线程的执行开始进而创建一个或多个附加线程,这就是所谓基于多线程的多任务。 2、多线程的创建与终止 要想创建新的线程,可以调用MFC的全局函数AfxBeginThread()。该函数启动新线程并返回控制,然后,新线程和调用AfxBeginThread()的线程同时运行。当用户需要终止一个线程的执行时, 需要调用函数TerminateThread()。这两个函数的详细说明可以查看MSDN帮助信息。 3、线程的同步 编写多线程应用程序的最重要的问题就是线程之间的资源同步访问。因为多个线程在共享资源时如果发生访问冲突通常会产生不正确的结果。例如,一个线程正在更新一个结构的内容的同时另一个线程正试图读取同一个结构。结果,我们将无法得知所读取的数据是什么状态:旧数据,新数据,还是二者的混合?MFC提供了一组同步和同步访问类来解决这个问题同步对象CSyncObject,CSemaphore,CMutex,CcriticalSection和CEvent;同步访问对象:CMultiLock和CSingleLock进程同步都要涉及到个经典问哲学家就餐问题下面来介绍一下哲学家就餐问题: 哲学家就餐问题中,一组哲学家围坐在一个圆桌旁,每个哲学家的左边都只有一只筷子(当然他的右边也有一只筷子,但是这是他右边哲学家的左边的筷子),他们吃完了就思考,思考了一会就会饿,饿了就想吃,然而,为了吃饭,他们必须获得左边和右边的筷子。当每个哲学家只拿有一只筷子的时候,会坐者等另一只筷子,在每个哲学家都只拿一个筷子的时候,就会发生死锁。1、利用AppWizard生成一个名为Philosophers基于的应用程序框架。CPhilosophersView构造函数先把每个哲学家对应的线程句柄设置为NULL,再新建一个同步类对象。 CPhilosophersView::CPhilosophersView() { // TODO: add construction code here for(int i = 0; i PHIL_NUM; i++) m_pThread[i] = NULL; m_pMutex = new CMutex; m_pEvent = new CEvent(FALSE, TRUE); } 3、模拟多个哲学家的行为 void CPhilosophersView::OnPlayMany() { // TODO: Add your command handler code here int i, left, right; int chopStartX[6], chopStartY[6], chopEndX[6], chopEndY[6]; int philX[6], philY[6]; PARAM *pParam = NULL; for(i = 0; i PHIL_NUM; i++) { chopSticks[i] = FALSE; } for (i =0; i PHIL_NUM; i++) { Finished[i] = FALSE; } m_pEvent-ResetEvent(); CHOP_COORDINATE(150, 150); PHIL_COORDINATE(150, 150); for(i = 0; i PHIL_NUM; i++) { pParam = new PARAM; if(NULL == pParam) { break; } pParam-Id = i; pParam-m_hWnd = this-m_hWnd; pParam-philX = philX[i]; pParam-philY = philY[i]; left = i; right = (i+1) % PHIL_NUM; pParam-chopXY[0] = chopS
文档评论(0)