欢迎来到天天文库
浏览记录
ID:15625374
大小:56.00 KB
页数:11页
时间:2018-08-04
《线程间实现同步互斥的方法》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、最近关注了几个其他线程间同步的方法,之前用的比较简单了,使用全局变量置标志,在线程中根据标志实现相应操作,搜索了一下,还有些其他方法,自己做了Demo,在此总结一下:1.临界区(CriticalSection):适合一个进程内的多线程访问公共区域或代码段时使用。 API: VOID EnterCriticalSection(LPCRITICAL_SECTIONlpCriticalSection); //进入临界区 VOID LeaveCriticalSection(LPCRITICAL_SECTIONlpCrit
2、icalSection); //离开临界区 某一线程调用EnterCriticalSection函数进入临界区后,必须保证最后可以调用LeaveCriticalSection,否则公共区域无法释放,并被其它线程访问。 在MFC中封装了CCriticalSection类,该类提供进入临界区和离开临界区的函数Lock()和Unlock() Ex: CCriticalSection cs; //临界区对象 void ThreadFunction() { cs.Lock(); //代码 c
3、s.Unlock(); }//endThreadFunction 2.互斥量(Mutex):适合不同进程内多线程访问公共区域或代码段时使用,与临界区相似。 HANDLECreateMutex(LPSECURITY_ATTRIBUTESlpMutexAttributes,BOOLbInitialOwner,LPCTSTRlpName); //创建一个互斥量,返回值为这个互斥量的句柄。参数bInitialOwner表示是否由调用此函数的进程拥有此互斥量 API: HANDLEOpenMutex(D
4、WORDdwDesiredAccess,BOOLhInheritHandle,LPCTSTRlpName);//打开一个已创建的互斥量 BOOLReleaseMutex(HANDLEhMutex); //释放 MFC中封装了CMutex类,同样的函数Lock()和Unlock()3.事件(Event):通过线程间触发事件实现同步互斥 API: HANDLECreateEvent(LPSECURITY_ATTRIBUTESlpEventAttributes,BOOLbManualReset,BOOLbIni
5、tialState,LPCTSTRlpName); //创建一个事件,返回值为事件句柄参数bManualReset表示是否通过手动重设事件,参数为TRUE,则需要调用ResetEvent重设事件,否则为自动重设 HANDLEOpenEvent(DWORDdwDesizedAccess,BOOLbInheritHandle,LPCTSTRlpName);//打开事件 在MFC中封装了CEvent类,包括SetEvent()触发事件、PulseEvent暂停事件、ResetEvent()重设事件及Unlock()释放事件
6、句柄4.信号量(Semaphore):与临界区和互斥量不同,可以实现多个线程同时访问公共区域数据,原理与操作系统中PV操作类似,先设置一个访问公共区域的线程最大连接数,每有一个线程访问共享区资源数就减一,直到资源数小于等于零。API: HANDLECreateSemaphore(LPSECURITY_ATTRIBUTES,LONGlInitialCount,LONGlMaxmemCount,LPCTSTRlpName);//创建信号量,返回句柄,参数lInitialCount为信号量资源初始数基数,参数lMaxmem
7、Count为该信号量的最大数HANDLEOpenSemaphore(DWORDdwDesiredAccess,BOOLhInheriHandle,LPCTSTRlpName);//打开信号量BOOLReleaseSemaphore(HANDLEbSemaphore,LONGlReleaseCount,LPLONGlpPreviousCount);//释放信号量在MFC中封装了CSemaphore类,声明该类的对象后使用API:WaitForSingleObject()函数实现等待访问资源,使用ReleaseSemap
8、hore函数释放资源,函数参数中需串入信号量对象句柄。总结:上述4个实现线程同步互斥的类均派生自虚基类CSyncObject,除临界区外其它3中方式均可用于多进程间线程同步互斥。另:线程触发自定义事件可使用API函数PostThreadMessage()函数,或创建CWinThread对象,调用该类的PostThreadMessage()互斥锁
此文档下载收益归作者所有