linux多线程之原子锁技术
?? ?其實(shí),早在《 多線程數(shù)據(jù)互斥》這篇博客中,我們就已經(jīng)介紹過(guò)原子鎖。本篇博客主要討論的就是原子鎖怎么使用。中間的一些用法只是我個(gè)人的一些經(jīng)驗(yàn),希望能夠拋磚引玉,多聽(tīng)聽(tīng)大家的想法。
?? ?(1)查找函數(shù)中原子鎖?? ?
?? ?在一些函數(shù)當(dāng)中,有的時(shí)候我們需要對(duì)滿足某種特性的數(shù)據(jù)進(jìn)行查找。在傳統(tǒng)的單核CPU上,優(yōu)化的空間比較有限。但是,現(xiàn)在多核CPU已經(jīng)成了主流配置。所以我們完全可以把這些查找工作分成幾個(gè)子函數(shù)分在幾個(gè)核上面并行運(yùn)算。但是,這中間就會(huì)涉及到一個(gè)問(wèn)題,那就是對(duì)公共數(shù)據(jù)的訪問(wèn)。傳統(tǒng)的訪問(wèn)方式,應(yīng)該是這樣的,
[cpp] view plaincopyprint??? ?我們看到代碼中間使用到了鎖,那么勢(shì)必會(huì)涉及到系統(tǒng)調(diào)用和函數(shù)調(diào)度。所以,在執(zhí)行效率上會(huì)大打折扣。那么如果使用原子鎖呢?
[cpp] view plaincopyprint?
?? ?有興趣的朋友可以做這樣一道題目,查看0~0xFFFFFFFF上有多少數(shù)可以被3整除?大家也可以驗(yàn)證一下用原子鎖代替臨界區(qū)之后,代碼的效率究竟可以提高多少。關(guān)于多核多線程的編程,朋友們可以參考《多線程基礎(chǔ)篇》這篇博客。
?? ?(2)代碼段中的原子鎖
?? ?上面的范例只是介紹了統(tǒng)計(jì)功能中的原子鎖。那么怎么用原子鎖代替?zhèn)鹘y(tǒng)的系統(tǒng)鎖呢?比如說(shuō),假設(shè)原來(lái)的數(shù)據(jù)訪問(wèn)是這樣的,
[cpp] view plaincopyprint?
?? ?這里用原子鎖代替普通的系統(tǒng)鎖,完成的功能其實(shí)是一樣的。那么這中間有什么區(qū)別呢?其實(shí),關(guān)鍵要看do_something要執(zhí)行多久。打個(gè)比方來(lái)說(shuō),現(xiàn)在我們?nèi)ベI(mǎi)包子,但是買(mǎi)包子的人很多。那怎么辦呢?有兩個(gè)選擇,如果賣(mài)包子的人手腳麻利,服務(wù)一個(gè)顧客只要10秒鐘,那么即使前面排隊(duì)的有50個(gè)人,我們只要等7、8分鐘就可以,這點(diǎn)等的時(shí)間還是值得的;但是如果不幸這個(gè)賣(mài)包子的老板服務(wù)一個(gè)顧客要1分鐘,那就悲催了,假使前面有50個(gè)人,那我們就要等50多分鐘了。50分鐘對(duì)我們來(lái)說(shuō)可是不短的一個(gè)時(shí)間,我們完全可以利用這個(gè)時(shí)間去買(mǎi)點(diǎn)水果,交交水電費(fèi)什么的,過(guò)了這個(gè)時(shí)間點(diǎn)再來(lái)買(mǎi)包子也不遲。
總結(jié)
以上是生活随笔為你收集整理的linux多线程之原子锁技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: logo免费在线设计,做自己品牌的设计师
- 下一篇: matlab识别黄色车牌,在网上下载了一