Windows线程同步和互斥.ppt

  1. 1、本文档共34页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Windows线程同步和互斥ppt整理

Windows线程同步和互斥 Windows线程同步机制 事件(Event) 临界区(Critical Section) 互斥量(Mutex) 信号量(Semaphore) 同步机制说明 互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。 如果只为了在进程内部用的话使用临界区会带来速度上的优势并能够减少资源占用量。 互斥量是跨进程的,一旦被创建,就可以通过名字打开它。创建互斥量需要的资源更多。 同步机制说明(续) 互斥量,信号量和事件都可以跨进程来实现同步数据操作。 互斥量:资源独占使用 信号量:资源计数器 事件 事件对象可以通过通知操作的方式来保持线程的同步。并且可以实现不同进程中的线程同步操作。 事件是WIN32中最灵活的线程间同步机制。 事件存在两种状态: 激发状态(Signaled or True) 未激发状态(Unsignaled or False) 事件 事件可分为两类: 手动设置: 这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。 自动恢复: 一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。 事件-函数原型 函数原型: HANDLE CreateEvent(  LPSECURITY_ATTRIBUTES lpEventAttributes,  // SECURITY_ATTRIBUTES结构指针,可为NULL  BOOL bManualReset,  // 手动/自动  // TRUE:在WaitForSingleObject后必须手动调用ResetEvent清除信号  // FALSE:在WaitForSingleObject后,系统自动清除事件信号  BOOL bInitialState, //初始状态  LPCTSTR lpName //事件的名称 ); 事件-函数原型(续) 使用“事件”机制应注意以下事项: 如果跨进程访问事件,必须对事件命名,在对事件命名的时候,要注意不要与系统命名空间中的其它全局命名对象冲突; 事件是否要自动恢复; 事件的初始状态设置。 由于event对象属于内核对象,故进程B可以调用OpenEvent函数通过对象的名字获得进程A中event对象的句柄,然后将这个句柄用于ResetEvent、SetEvent和WaitForMultipleObjects等函数中。此法可以实现一个进程的线程控制另一进程中线程的运行,例如: HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,true,MyEvent); ResetEvent(hEvent); 事件-例子 三个线程: 主线程 读线程 写线程 读线程必须在写线程操作结束后才能进行读; 主线程必须等读和写线程结束后才能结束 代码 include stdafx.h #include windows.h #include process.h #include iostream.h #include fstream.h HANDLE evRead,evFinish; void ReadThread(LPVOID param) { WaitForSingleObject(evRead, INFINITE); coutReadingendl; SetEvent(evFinish); } void WriteThread(LPVOID param) { coutWritingendl; SetEvent(evRead); } 代码(续) int main(int argc, char* argv[]) { evRead= CreateEvent(NULL,FALSE,FALSE,NULL); evFinish= CreateEvent(NULL,FALSE,FALSE,NULL); _beginthread(ReadThread,0,NULL); _beginthread(WriteThread,0,NULL); WaitForSingleObject(evFinish, INFINITE); coutEnd.endl; return 0; } 临界区 临界区是保证在某一时刻只有一个线程能访问数据的简便办法。在任意时刻只允许一个线程对共享资源进行访问。 如果有多个线程试图同时访问临界区,那么在有一个线程进入后其他所有试图访问此临界区的线程将被挂起,并一直持续到进入临界区的线程离开。临界区在被释放后,其他线程可以继续抢占,并以此达到用原子方式操作共享资源的目的。 ??? 临界区(续) 临界区包含两个操作原语: EnterCriticalSecti

文档评论(0)

zyzsaa + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档