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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux多线程之原子锁技术

發(fā)布時(shí)間:2023/12/20 linux 41 豆豆
生活随笔 收集整理的這篇文章主要介紹了 linux多线程之原子锁技术 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
原子鎖是多線程編程中的一個(gè)特色。然而,在平時(shí)的軟件編寫中,原子鎖的使用并不是很多。這其中原因很多,我想主要有兩個(gè)方面。第一,關(guān)于原子鎖這方面的內(nèi)容介紹的比較少;第二,人們?cè)诰幊躺厦媪?xí)慣于已有的方案,如果沒有特別的需求,不過貿(mào)然修改已存在的代碼。畢竟對(duì)很多人來說,不求有功,但求無過。保持當(dāng)前代碼的穩(wěn)定性還是很重要的。 ?
?? ?其實(shí),早在《 多線程數(shù)據(jù)互斥》這篇博客中,我們就已經(jīng)介紹過原子鎖。本篇博客主要討論的就是原子鎖怎么使用。中間的一些用法只是我個(gè)人的一些經(jīng)驗(yàn),希望能夠拋磚引玉,多聽聽大家的想法。

?? ?(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è)問題,那就是對(duì)公共數(shù)據(jù)的訪問。傳統(tǒng)的訪問方式,應(yīng)該是這樣的,

[cpp] view plaincopyprint?
  • unsigned?int?count?=?0;??
  • ??
  • int?find_data_process()??
  • {??
  • ????if(/*?data?meets?our?standards?*/){??
  • ?????????EnterCriticalSection(&cs);??
  • ?????????count?++;??
  • ?????????LeaveCriticalSection(&cs);???????????
  • ????}??
  • }??
  • unsigned int count = 0;int find_data_process() {if(/* data meets our standards */){EnterCriticalSection(&cs);count ++;LeaveCriticalSection(&cs); } }
    ?? ?我們看到代碼中間使用到了鎖,那么勢(shì)必會(huì)涉及到系統(tǒng)調(diào)用和函數(shù)調(diào)度。所以,在執(zhí)行效率上會(huì)大打折扣。那么如果使用原子鎖呢?

    [cpp] view plaincopyprint?
  • unsigned?int?count?=?0;??
  • ??
  • int?find_data_process()??
  • {??
  • ????if(/*?data?meets?our?standards?*/){??
  • ????????InterLockedIncrement(&count);??
  • ????}??
  • }??
  • unsigned int count = 0;int find_data_process() {if(/* data meets our standards */){InterLockedIncrement(&count);} }

    ?? ?有興趣的朋友可以做這樣一道題目,查看0~0xFFFFFFFF上有多少數(shù)可以被3整除?大家也可以驗(yàn)證一下用原子鎖代替臨界區(qū)之后,代碼的效率究竟可以提高多少。關(guān)于多核多線程的編程,朋友們可以參考《多線程基礎(chǔ)篇》這篇博客。


    ?? ?(2)代碼段中的原子鎖
    ?? ?上面的范例只是介紹了統(tǒng)計(jì)功能中的原子鎖。那么怎么用原子鎖代替?zhèn)鹘y(tǒng)的系統(tǒng)鎖呢?比如說,假設(shè)原來的數(shù)據(jù)訪問是這樣的,

    [cpp] view plaincopyprint?
  • void?data_process()??
  • {??
  • ????EnterCriticalSection(&cs);??
  • ????do_something();??
  • ????LeaveCriticalSection(&cs);?????
  • }??
  • void data_process() {EnterCriticalSection(&cs);do_something();LeaveCriticalSection(&cs); }?? ?如果改成原子鎖呢,會(huì)是什么樣的呢?
    [cpp] view plaincopyprint?
  • unsigned?int?lock?=?0;??
  • ??
  • void?data_process()??
  • {??
  • ????while(1?==?InterLockedCompareExchange(&lock,?1,?0));??
  • ????do_something();??
  • ????lock?=?0;??????
  • }??
  • unsigned int lock = 0;void data_process() {while(1 == InterLockedCompareExchange(&lock, 1, 0));do_something();lock = 0; }

    ?? ?這里用原子鎖代替普通的系統(tǒng)鎖,完成的功能其實(shí)是一樣的。那么這中間有什么區(qū)別呢?其實(shí),關(guān)鍵要看do_something要執(zhí)行多久。打個(gè)比方來說,現(xiàn)在我們?nèi)ベI包子,但是買包子的人很多。那怎么辦呢?有兩個(gè)選擇,如果賣包子的人手腳麻利,服務(wù)一個(gè)顧客只要10秒鐘,那么即使前面排隊(duì)的有50個(gè)人,我們只要等7、8分鐘就可以,這點(diǎn)等的時(shí)間還是值得的;但是如果不幸這個(gè)賣包子的老板服務(wù)一個(gè)顧客要1分鐘,那就悲催了,假使前面有50個(gè)人,那我們就要等50多分鐘了。50分鐘對(duì)我們來說可是不短的一個(gè)時(shí)間,我們完全可以利用這個(gè)時(shí)間去買點(diǎn)水果,交交水電費(fèi)什么的,過了這個(gè)時(shí)間點(diǎn)再來買包子也不遲。


    ?? ?和上面的例子一樣,忙等的方法就是原子鎖,過一會(huì)再來的方法就是哪個(gè)傳統(tǒng)的系統(tǒng)鎖。用哪個(gè),就看這個(gè)do_something的時(shí)間值不值得我們等待了。


    總結(jié)

    以上是生活随笔為你收集整理的linux多线程之原子锁技术的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

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