成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

怎么理解多核編程中的條件同步模式

本篇內(nèi)容介紹了“怎么理解多核編程中的條件同步模式”的有關(guān)知識(shí),在實(shí)際案例的操作過(guò)程中,不少人都會(huì)遇到這樣的困境,接下來(lái)就讓小編帶領(lǐng)大家學(xué)習(xí)一下如何處理這些情況吧!希望大家仔細(xì)閱讀,能夠?qū)W有所成!

創(chuàng)新互聯(lián)公司長(zhǎng)期為上1000家客戶提供的網(wǎng)站建設(shè)服務(wù),團(tuán)隊(duì)從業(yè)經(jīng)驗(yàn)10年,關(guān)注不同地域、不同群體,并針對(duì)不同對(duì)象提供差異化的產(chǎn)品和服務(wù);打造開(kāi)放共贏平臺(tái),與合作伙伴共同營(yíng)造健康的互聯(lián)網(wǎng)生態(tài)環(huán)境。為椒江企業(yè)提供專(zhuān)業(yè)的做網(wǎng)站、網(wǎng)站設(shè)計(jì),椒江網(wǎng)站改版等技術(shù)服務(wù)。擁有十多年豐富建站經(jīng)驗(yàn)和眾多成功案例,為您定制開(kāi)發(fā)。

在多線程編程中,當(dāng)對(duì)共享資源進(jìn)行操作時(shí),需要使用同步(通常是鎖或原子操作)來(lái)進(jìn)行保護(hù),以避免數(shù)據(jù)競(jìng)爭(zhēng)問(wèn)題。不幸的是,同步操作的開(kāi)銷(xiāo)非常大,比如對(duì)一個(gè)整數(shù)變量進(jìn)行加法操作,那么同步操作的開(kāi)銷(xiāo)是加法操作的上百倍以上。

有沒(méi)有辦法可以減少這種同步操作的開(kāi)銷(xiāo)呢?如果能設(shè)計(jì)出更快的鎖或更快的原子操作來(lái),那么這種開(kāi)銷(xiāo)自然就減少了。以目前的技術(shù)來(lái)看,最快速的原子操作耗時(shí)也是普通加法操作的上百倍,所以從這方面著手是非常困難的。

那么能不能從軟件算法的角度來(lái)減少同步操作的開(kāi)銷(xiāo)呢?答案是當(dāng)然可以,基本思想是減少使用同步的次數(shù),比如原來(lái)要使用同步1000次,現(xiàn)在改為在滿足一定條件下才使用同步,只需要10次,那么同步的開(kāi)銷(xiāo)平攤下來(lái)就被減少了100倍,效率大大提高了。下面先來(lái)看一個(gè)共享隊(duì)列例子。

一個(gè)普通的共享隊(duì)列通常都是使用鎖來(lái)實(shí)現(xiàn),當(dāng)然也有用CAS原子操作來(lái)實(shí)現(xiàn)的,這里只討論用鎖來(lái)實(shí)現(xiàn)的共享隊(duì)列。

在有鎖保護(hù)的共享隊(duì)列中,在隊(duì)列的進(jìn)隊(duì)和出隊(duì)操作時(shí),通常都是使用鎖來(lái)進(jìn)行保護(hù)的,一個(gè)典型的使用鎖保護(hù)的出隊(duì)操作偽代碼如下:

template class <T>        Locked_DeQueue(T &data)        {               Lock();               DeQueue(data);  //調(diào)用串行的出隊(duì)操作               Unlock();        }

在使用上面的Locked_DeQueue()函數(shù)時(shí),每調(diào)用一次,就會(huì)發(fā)生一次鎖操作。事實(shí)上,并不是每次都需要加鎖操作的,比如隊(duì)列為空時(shí),這時(shí)實(shí)際上是不需要進(jìn)行出隊(duì)操作的,完全可以采取的一定的方法避免鎖操作,但是采用上面的Locked_DeQueue()函數(shù)無(wú)法避免鎖操作,這就需要對(duì)上面的函數(shù)進(jìn)行改進(jìn)。

一種最容易想到的方面就是先判斷隊(duì)列是否為空,如果不為空才使用鎖保護(hù)進(jìn)行出隊(duì)操作。代碼如下:

template class <T>         Locked_DeQueue_a(T &data)         {                If ( !IsEmpty() )                {                       Lock();                       DeQueue(data);  //調(diào)用串行的出隊(duì)操作                       Unlock();                }         }

上面的Locked_DeQueue_a()函數(shù)的一個(gè)關(guān)鍵之處是IsEmpty()函數(shù)必須不能使用鎖操作,否則不僅沒(méi)有減少同步開(kāi)銷(xiāo),反而將同步開(kāi)銷(xiāo)增大了近一倍。

如何來(lái)使得IsEmtpy()函數(shù)不用鎖操作呢,以數(shù)組實(shí)現(xiàn)的環(huán)行隊(duì)列為例,在判斷隊(duì)列是否為空時(shí),其基本方法是判斷隊(duì)首指針是否等于隊(duì)尾指針。偽代碼如下:

INT IsEmpty() {        Lock()         if ( 隊(duì)首指針 == 隊(duì)尾指針 )         {               Unlock();                return 1; //為空        }         else         {                   Unlock();                return 0; //非空        }  }

由于隊(duì)首指針和隊(duì)尾指針在進(jìn)隊(duì)或出隊(duì)操作時(shí)會(huì)發(fā)生改變,因此在上面的IsEmpty()函數(shù)中,需要使用鎖保護(hù),那么如何去掉這層鎖保護(hù)呢?

基本的方法是設(shè)一個(gè)標(biāo)志變量EmptyFlag,在進(jìn)隊(duì)和出隊(duì)操作中,當(dāng)隊(duì)列為空時(shí),標(biāo)志變量的值置為1,隊(duì)列非空時(shí),標(biāo)志變量的值置為0。這樣判斷隊(duì)列是否為空就可以通過(guò)EmptyFlag單個(gè)變量來(lái)進(jìn)行,而單個(gè)變量的讀寫(xiě)可以使用原子操作來(lái)實(shí)現(xiàn),使得讀操作和普通操作一樣不存在同步操作。

下面是使用EmptyFlag變量實(shí)現(xiàn)的出隊(duì)操作。

  1. template class <T> 

  2.        Locked_DeQueue_b(T &data) 

  3.  

  4.        {

  5.               if ( EmptyFlag ) 

  6.               { 

  7.                      return; 

  8.               } 

  9.               Lock(); 

  10.  

  11.               if ( !EmptyFlag )  //Lock()前, 其他線程可能修改了標(biāo)志 

  12.  

  13.               { 

  14.                      DeQueue(data);  //調(diào)用串行的出隊(duì)操作 

  15.  

  16.                   if ( 隊(duì)首指針 == 隊(duì)尾指針 ) 

  17.  

  18.                   { 

  19.                       //出隊(duì)后,隊(duì)列變空,使用原子操作將EmptyFlag置為1 

  20.  

  21.                       AtomicIncrement(&EmptyFlag); 

  22.                   } 

  23.               } 

  24.  

  25.               Unlock(); 

  26.        } 

隊(duì)列的是否為空函數(shù)可以使用下面的完全不需要同步的實(shí)現(xiàn)。

INT IsEmpty()         {                return EmptyFlag;         }

從Locked_DeQueue_b()函數(shù)的實(shí)現(xiàn)可以看出,如果隊(duì)列本來(lái)為空的情況下,它只判斷一個(gè)EmptyFlag就返回了,不會(huì)調(diào)用鎖操作,減少了同步使用的次數(shù),并且在IsEmpty()函數(shù)中,根本不需要使用同步,這對(duì)于那些需要頻繁判斷隊(duì)列是否為空的使用場(chǎng)景,有很好的效果。

比 如對(duì)于動(dòng)態(tài)任務(wù)調(diào)度,假設(shè)使用普通的有鎖的共享隊(duì)列。當(dāng)一個(gè)線程私有隊(duì)列為空時(shí),需要去偷取其他線程的共享隊(duì)列中的任務(wù),如果偷取的隊(duì)列為空則發(fā)生了一次 鎖操作,此時(shí)需要再偷另外一個(gè)隊(duì)列的任務(wù),如果這個(gè)隊(duì)列仍然為空則又要一次鎖操作,一次獲取任務(wù)的操作中將可能出現(xiàn)多次加鎖解鎖的情況。通過(guò)上面講的條件 同步方法就可以在偷取取一個(gè)任務(wù)時(shí),只要一次鎖操作就可以實(shí)現(xiàn)。

上面講的條件同步模式非常適應(yīng)于具有狀態(tài)機(jī)性質(zhì)的場(chǎng)合,只有在發(fā)生狀態(tài)切換(例如隊(duì)列中空或非空的狀態(tài)的切換)時(shí)才使用同步,通過(guò)對(duì)狀態(tài)變量(例如EmptyFlag)的操作來(lái)替代其他非狀態(tài)變量(例如隊(duì)首指針和隊(duì)尾指針)的操作,減少同步的使用。

“怎么理解多核編程中的條件同步模式”的內(nèi)容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業(yè)相關(guān)的知識(shí)可以關(guān)注創(chuàng)新互聯(lián)網(wǎng)站,小編將為大家輸出更多高質(zhì)量的實(shí)用文章!

名稱欄目:怎么理解多核編程中的條件同步模式
當(dāng)前路徑:http://jinyejixie.com/article8/iejcip.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供ChatGPT、全網(wǎng)營(yíng)銷(xiāo)推廣、企業(yè)建站、網(wǎng)站改版、網(wǎng)站內(nèi)鏈、移動(dòng)網(wǎng)站建設(shè)

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)

搜索引擎優(yōu)化
定襄县| 定西市| 无为县| 常州市| 改则县| 布尔津县| 阳东县| 乐都县| 舟山市| 台安县| 台安县| 眉山市| 寿宁县| 五家渠市| 沙河市| 绥芬河市| 苏尼特右旗| 桃园市| 马龙县| 额济纳旗| 中阳县| 阳东县| 新竹县| 常州市| 山东省| 迁安市| 香河县| 萍乡市| 永德县| 蒙山县| 个旧市| 叙永县| 项城市| 博罗县| 巴马| 正定县| 定州市| 突泉县| 岢岚县| 巍山| 来宾市|