- 1、本文档共11页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
线程间实现同步互斥具体办法
最近关注了几个其他线程间同步的方法,之前用的比较简单了,使用全局变量置标志,在线程中根据标志实现相应操作,搜索了一下,还有些其他方法,自己做了Demo,在此总结一下:
1.临界区(Critical Section):适合一个进程内的多线程访问公共区域或代码段时使用。
? API:
? VOID ?EnterCriticalSection(LPCRITICAL_SECTION lpCriticalSection);??? //进入临界区
? VOID? LeaveCriticalSection(LPCRITICAL_SECTION lpCriticalSection);?? //离开临界区
? 某一线程调用EnterCriticalSection函数进入临界区后,必须保证最后可以调用LeaveCriticalSection,否则公共区域无法释放,并被其它线程访问。
??在MFC中封装了CCriticalSection类,该类提供进入临界区和离开临界区的函数Lock()和Unlock()
? Ex:
??CCriticalSection? cs;?? //临界区对象
? void? ThreadFunction()
? {
?????? cs.Lock();
??????// 代码
???? ? cs.Unlock();????????
?? } //end ThreadFunction
?
2.互斥量 (Mutex):适合不同进程内多线程访问公共区域或代码段时使用,与临界区相似。
? HANDLE CreateMutex(LPSECURITY_ATTRIBUTES lpMutexAttributes,BOOL bInitialOwner,LPCTSTR lpName);
?? //创建一个互斥量,返回值为这个互斥量的句柄。参数bInitialOwner表示是否由调用此函数的进程拥有此互斥量
? API:?
? ?HANDLE OpenMutex(DWORD dwDesiredAccess,BOOL hInheritHandle,LPCTSTR lpName);//打开一个已创建的互斥量
?? BOOL ReleaseMutex(HANDLE hMutex);?? //释放
?? MFC中封装了CMutex类,同样的函数Lock()和Unlock()
3.事件(Event):通过线程间触发事件实现同步互斥
?API:??
?? HANDLE CreateEvent(LPSECURITY_ATTRIBUTES lpEventAttributes,BOOL bManualReset,BOOL bInitialState,LPCTSTR lpName);? //创建一个事件,返回值为事件句柄 参数bManualReset表示是否通过手动重设事件,参数为TRUE,则需要调用ResetEvent重设事件,否则为自动重设
?HANDLE OpenEvent(DWORD dwDesizedAccess,BOOL bInheritHandle,LPCTSTR lpName);//打开事件
?在MFC中封装了CEvent类,包括SetEvent() 触发事件、PulseEvent 暂停事件、ResetEvent()重设事件及Unlock()释放事件句柄
4.信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理与操作系统中PV操作类似,先设置一个访问公共区域的线程最大连接数,每有一个线程访问共享区资源数就减一,直到资源数小于等于零。
API:
?HANDLE CreateSemaphore(LPSECURITY_ATTRIBUTES,LONG lInitialCount,LONG lMaxmemCount,LPCTSTR lpName);
//创建信号量,返回句柄,参数lInitialCount为信号量资源初始数基数,参数lMaxmemCount为该信号量的最大数
HANDLE OpenSemaphore(DWORD dwDesiredAccess,BOOL hInheriHandle,LPCTSTR lpName);//打开信号量
BOOL ReleaseSemaphore(HANDLE bSemaphore,LONG lReleaseCount,LPLONG lpPreviousCount); //释放信号量
在MFC中封装了CSemaphore类,声明该类的对象后使用API:WaitForSingleObject()函数实现等待访问资源,使用ReleaseSemaphore函数释放资源,函数参数中需串入信号量对象句柄。
总结:上述4个实现线程同步互斥的类均派生自虚基类CSyncObject,除临界区
您可能关注的文档
最近下载
- 部编版语文三年级下册第四单元教材解读大单元集体备课.pptx VIP
- 语文教材改编校园课本剧剧本《智取生辰纲》.docx
- 课题申报书:学龄人口变动背景下“小班化”教学研究.docx VIP
- 2025年滁州市烟草专卖局人员招聘笔试备考试题及答案解析.docx
- 部编版小学语文三年级下册第四单元基于大单元教学教材分析解读.pptx
- 大气沉稳Word简历模板(IT类) (1).doc VIP
- 人教精通版英语五年级下册Lesson31-Lesson32优秀课件.ppt VIP
- 2024-2030年中国聚乳酸(PLA)3D打印灯丝行业需求潜力与盈利前景预测报告.docx
- 西南民族大学论文答辩通用PPT模板.pptx
- 高频商务英语词汇.pdf
文档评论(0)