C++多线程同步效率对比之临界区和原子锁
生活随笔
收集整理的這篇文章主要介紹了
C++多线程同步效率对比之临界区和原子锁
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
多線程編程經(jīng)常遇到數(shù)據(jù)同步問題,通常的做法就是加鎖,之前個人常用臨界區(qū)(CTITICAL_SECTION),最近開發(fā)高效率程序,尋求更高效的同步方式,才有了對原子鎖的研究。經(jīng)測試,原子鎖效率確實比臨界區(qū)高,用數(shù)據(jù)衡量,原子鎖的效率是臨界區(qū)的5倍左右。
測試方法:
1、主線程加鎖
2、工作線程等待
3、主線程解鎖
4、工作線程結(jié)束等待
測試結(jié)果:測試3、4步驟之間的耗時,臨界區(qū)耗時5~6微秒,原子鎖耗時1~2微秒。
關(guān)于臨界區(qū)和原子鎖,請baidu看看相關(guān)文章,這里不多介紹了。注意原子鎖不能嵌套使用,否則會被鎖死,臨界區(qū)沒這個問題。
包裝了兩個類分別實現(xiàn)臨界區(qū)(CLock)和原子鎖(CLockAtom),同時包裝了兩個在作用域中方便使用的類(CLockRegion和CLockAtomRegion),具體使用見下面代碼。
CLock類
#include <windows.h>namespace UtilTool {class CLock{public:CLock(void){InitializeCriticalSection(&cs);}~CLock(void){DeleteCriticalSection(&cs);}inline void Lock(){EnterCriticalSection(&cs);}inline void UnLock(){LeaveCriticalSection(&cs);}private:CRITICAL_SECTION cs;};class CLockRegion{public:CLockRegion(CLock* lock) : m_lock(lock){m_lock->Lock();}~CLockRegion(){m_lock->UnLock();}private:CLock* m_lock;}; }CLockAtom類 #include <windows.h>namespace UtilTool {struct _UTILTOOL_IMPORT_EXPORT_TYPE_ CAtom{public:CAtom(){m_l = 0;}volatile long* Get(){return &m_l;}private:volatile long m_l;};//原子鎖//切忌嵌套使用class CLockAtom{public:CLockAtom(void){m_ics = 0;}~CLockAtom(void){}inline void Lock(){while (InterlockedExchange(&m_ics, 1) == 1){Sleep(0);}}inline void UnLock(){InterlockedExchange(&m_ics, 0);}static inline void Lock(CAtom* pAtom){while (InterlockedExchange(pAtom->Get(), 1) == 1){Sleep(0);}}static inline void UnLock(CAtom* pAtom){InterlockedExchange(pAtom->Get(), 0);}private:volatile long m_ics;};class CLockAtomRegion{public:CLockAtomRegion(CLockAtom* lock){m_atom = NULL;m_lock = lock;m_lock->Lock();}CLockAtomRegion(CAtom* atom){m_atom = atom;m_lock = NULL;CLockAtom::Lock(m_atom);}~CLockAtomRegion(){if (m_lock){m_lock->UnLock();}else if (m_atom){CLockAtom::UnLock(m_atom);}}private:CLockAtom* m_lock;CAtom* m_atom;}; }
CLockRegion的用法,CLockAtomRegion類似
CLock lock;void MyFunc() {//進(jìn)入函數(shù),_lock被創(chuàng)建,調(diào)用CLockRegion構(gòu)造函數(shù),加鎖CLockRegion _lock(&lock);//do something//函數(shù)退出,_lock被析構(gòu),解鎖 }總結(jié)
以上是生活随笔為你收集整理的C++多线程同步效率对比之临界区和原子锁的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ESD-CAN安装调试笔记
- 下一篇: 计算机术语中lisp,Lisp语言之父、