日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程语言 > c/c++ >内容正文

c/c++

C++多线程同步效率对比之临界区和原子锁

發(fā)布時(shí)間:2023/12/20 c/c++ 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 C++多线程同步效率对比之临界区和原子锁 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

多線程編程經(jīng)常遇到數(shù)據(jù)同步問(wèn)題,通常的做法就是加鎖,之前個(gè)人常用臨界區(qū)(CTITICAL_SECTION),最近開(kāi)發(fā)高效率程序,尋求更高效的同步方式,才有了對(duì)原子鎖的研究。經(jīng)測(cè)試,原子鎖效率確實(shí)比臨界區(qū)高,用數(shù)據(jù)衡量,原子鎖的效率是臨界區(qū)的5倍左右。

測(cè)試方法:

1、主線程加鎖

2、工作線程等待

3、主線程解鎖

4、工作線程結(jié)束等待

測(cè)試結(jié)果:測(cè)試3、4步驟之間的耗時(shí),臨界區(qū)耗時(shí)5~6微秒,原子鎖耗時(shí)1~2微秒。


關(guān)于臨界區(qū)和原子鎖,請(qǐng)baidu看看相關(guān)文章,這里不多介紹了。注意原子鎖不能嵌套使用,否則會(huì)被鎖死,臨界區(qū)沒(méi)這個(gè)問(wèn)題。


包裝了兩個(gè)類(lèi)分別實(shí)現(xiàn)臨界區(qū)(CLock)和原子鎖(CLockAtom),同時(shí)包裝了兩個(gè)在作用域中方便使用的類(lèi)(CLockRegion和CLockAtomRegion),具體使用見(jiàn)下面代碼。

CLock類(lèi)

#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類(lèi)

#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類(lèi)似

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++多线程同步效率对比之临界区和原子锁的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。