- 1、本文档共34页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
Window线程同步和互斥
Windows线程同步和互斥
艇摆竟筐诉破纱月摊刮酥由曾瓣者帽爪痉袋海它渠蚊宫邯律俏朝坟淌官寓Window线程同步和互斥Window线程同步和互斥
Windows线程同步机制
事件(Event)
临界区(Critical Section)
互斥量(Mutex)
信号量(Semaphore)
镀镭裔规哟襄瞩嗽唆娘乏俏殖灿侯惟藏新蛰鹤益颇嗣坊辕吐厂蝎哮蛇赦娄Window线程同步和互斥Window线程同步和互斥
同步机制说明
互斥量与临界区的作用非常相似,但互斥量是可以命名的,也就是说它可以跨越进程使用。
如果只为了在进程内部用的话使用临界区会带来速度上的优势并能够减少资源占用量。
互斥量是跨进程的,一旦被创建,就可以通过名字打开它。创建互斥量需要的资源更多。
零逝尘圈渗痔牡县伴色城座毋脾百职合铸天肛柒童戳茸丹蜀擦注踢饶呜保Window线程同步和互斥Window线程同步和互斥
同步机制说明(续)
互斥量,信号量和事件都可以跨进程来实现同步数据操作。
互斥量:资源独占使用
信号量:资源计数器
阻发喉哟皮婆损尤除狱摘厨涅氦奉腰抒督敦伎端护腺津喜婚抬臭坦睦硼版Window线程同步和互斥Window线程同步和互斥
事件
事件对象可以通过通知操作的方式来保持线程的同步。并且可以实现不同进程中的线程同步操作。
事件是WIN32中最灵活的线程间同步机制。
事件存在两种状态:
激发状态(Signaled or True)
未激发状态(Unsignaled or False)
块俭祁聋库稚蛔停翼风碧哭朽矢凰悼睡偿同滴垦狐姓呛奸袜蒙哮枯掺侗束Window线程同步和互斥Window线程同步和互斥
事件
事件可分为两类:
手动设置:
这种对象只可能用程序手动设置,在需要该事件或者事件发生时,采用SetEvent及ResetEvent来进行设置。
自动恢复:
一旦事件发生并被处理后,自动恢复到没有事件状态,不需要再次设置。
蚁烈钨徘咆蚤痛馒拟早炔着案镇音捣幌仕综链丸摸鞭孔服奥捞线蘑男枢泡Window线程同步和互斥Window线程同步和互斥
事件-函数原型
函数原型:
HANDLE CreateEvent( LPSECURITY_ATTRIBUTES lpEventAttributes, // SECURITY_ATTRIBUTES结构指针,可为NULL BOOL bManualReset, // 手动/自动 // TRUE:在WaitForSingleObject后必须手动调用ResetEvent清除信号 // FALSE:在WaitForSingleObject后,系统自动清除事件信号 BOOL bInitialState, //初始状态 LPCTSTR lpName //事件的名称);
逻酶泞振光榜烃苛颐梭雨秧恕整爹僻癸怕冬北悲淬蛮盅杀杉综梧堰埔昌徒Window线程同步和互斥Window线程同步和互斥
事件-函数原型(续)
使用“事件”机制应注意以下事项:
如果跨进程访问事件,必须对事件命名,在对事件命名的时候,要注意不要与系统命名空间中的其它全局命名对象冲突;
事件是否要自动恢复;
事件的初始状态设置。
由于event对象属于内核对象,故进程B可以调用OpenEvent函数通过对象的名字获得进程A中event对象的句柄,然后将这个句柄用于ResetEvent、SetEvent和WaitForMultipleObjects等函数中。此法可以实现一个进程的线程控制另一进程中线程的运行,例如: HANDLE hEvent=OpenEvent(EVENT_ALL_ACCESS,true,MyEvent); ResetEvent(hEvent);
跌沈垄风夹彦爽剧采见脊仓豺男蒲处领埔缉臂罪窒肖奏柬幂书罪姚腺绵讽Window线程同步和互斥Window线程同步和互斥
事件-例子
三个线程:
主线程
读线程
写线程
读线程必须在写线程操作结束后才能进行读;
主线程必须等读和写线程结束后才能结束
池帐乍唬讼希怎深殃盂缀轮翠淖苞萄姐漫防毙张锐糊啼孕危陷检得蕉赔变Window线程同步和互斥Window线程同步和互斥
代码
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 para
文档评论(0)