99精品伊人亚洲|最近国产中文炮友|九草在线视频支援|AV网站大全最新|美女黄片免费观看|国产精品资源视频|精彩无码视频一区|91大神在线后入|伊人终合在线播放|久草综合久久中文

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

無(wú)鎖隊(duì)列的潛在優(yōu)勢(shì)

科技綠洲 ? 來(lái)源:Linux開(kāi)發(fā)架構(gòu)之路 ? 作者:Linux開(kāi)發(fā)架構(gòu)之路 ? 2023-11-09 09:23 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

無(wú)鎖隊(duì)列

先大致介紹一下無(wú)鎖隊(duì)列。無(wú)鎖隊(duì)列的根本是CAS函數(shù)——CompareAndSwap,即比較并交換,函數(shù)功能可以用C++函數(shù)來(lái)說(shuō)明:

int compare_and_swap (int* reg, int oldval, int newval)
{
int old_reg_val = *reg;
if (old_reg_val == oldval)
*reg = newval;
return old_reg_val;
}

它將reg的值與oldval的值進(jìn)行對(duì)比,若相同則將reg賦新值。注意以上操作是原子操作。大部分語(yǔ)言都有提供CAS支持,不過(guò)函數(shù)原型可能有些微的不同,許多語(yǔ)言(包括go)中CAS的返回值是標(biāo)識(shí)是否賦值成功的bool值。

無(wú)鎖隊(duì)列則是以CAS來(lái)實(shí)現(xiàn)同步的一種隊(duì)列,我的具體實(shí)現(xiàn)這里就不貼出來(lái)了,有點(diǎn)冗長(zhǎng),文末給出了源碼地址。這里僅僅大致給出實(shí)現(xiàn)思路,網(wǎng)上關(guān)于無(wú)鎖隊(duì)列的資料很多,這里就不詳細(xì)說(shuō)了。

EnQueue(x) //進(jìn)隊(duì)列改良版
{
q = new record();
q->value = x;
q->next = NULL;

p = tail;
oldp = p
do {
while (p->next != NULL)
p = p->next;
} while( CAS(p.next, NULL, q) != TRUE); //如果沒(méi)有把結(jié)點(diǎn)鏈在尾上,再試

CAS(tail, oldp, q); //置尾結(jié)點(diǎn)
}

DeQueue() //出隊(duì)列
{
do{
p = head;
if (p->next == NULL){
return ERR_EMPTY_QUEUE;
}
while( CAS(head, p, p->next) != TRUE );
return p->next->value;
}

自旋鎖

自旋鎖是加鎖失敗時(shí)接著循環(huán)請(qǐng)求加鎖,直到成功。它的特點(diǎn)是不會(huì)釋放CPU,故也沒(méi)有互斥鎖那種內(nèi)核態(tài)切換操作,但缺點(diǎn)也很明顯,就是會(huì)一直占用CPU,理論上適用于臨界區(qū)小、不需要長(zhǎng)時(shí)間加鎖的場(chǎng)景。 這里只貼鎖的相關(guān)代碼,隊(duì)列的實(shí)現(xiàn)就不貼了:

// 自旋鎖
type spinMutex struct {
mutex int32
}
const locked = 1
const unlocked = 0
func (spin *spinMutex) lock() {
for !atomic.CompareAndSwapInt32(&spin.mutex, unlocked, locked) {}
}
func (spin *spinMutex) unlock() {
atomic.SwapInt32(&spin.mutex, unlocked)
}

互斥鎖

這個(gè)沒(méi)什么好說(shuō)的,用的golang自帶的互斥鎖sync.Mutex。

測(cè)試

下面將分2種場(chǎng)景進(jìn)行測(cè)試:分別是高并發(fā)和低并發(fā)。高并發(fā)我用4個(gè)協(xié)程往隊(duì)列中push數(shù)據(jù),4個(gè)協(xié)程從隊(duì)列中pop數(shù)據(jù)(雖然不是很高,但足以區(qū)分性能,就沒(méi)測(cè)太高并發(fā)了,畢竟測(cè)一次等的太久也累);低并發(fā)不好模擬,于是我干脆極端點(diǎn)改為無(wú)并發(fā)——先順序?qū)懀夙樞蜃x。

無(wú)并發(fā)

大致測(cè)試代碼結(jié)構(gòu)如下(刪減了不關(guān)鍵的語(yǔ)句):

t1 := time.Now()
for i := 1; i <= dataNum; i++ {
suc := queue.PushBack(i)
}
queue.Disable()

for {
val, enable := queue.PopFront()
if !enable {
break
}
}
fmt.Println("用時(shí):", time.Since(t1))

為了方便對(duì)比,我特地還增加了不加鎖的隊(duì)列的測(cè)試結(jié)果。測(cè)試結(jié)果如下:(左側(cè)為dataNum數(shù)據(jù)量)

圖片

添加圖片注釋,不超過(guò) 140 字(可選)

可以看到數(shù)據(jù)量小的時(shí)候性能差別還不明顯,甚至cas還有少許的優(yōu)勢(shì)。但數(shù)據(jù)量一大就很明顯的看出自旋鎖的效率會(huì)高一點(diǎn),cas次之。不過(guò)它們差別都不大。

高并發(fā)

這里用4個(gè)生產(chǎn)者4個(gè)消費(fèi)者共用一個(gè)隊(duì)列來(lái)模擬高并發(fā)。測(cè)試代碼結(jié)構(gòu)如下:

func test() {
wgr := sync.WaitGroup{}
wgw := sync.WaitGroup{}
t1 := time.Now()
for i := 0; i < 4; i++ {
wgr.Add(1)
go reader(i*1000000, &wgr)
}
for i := 0; i < 4; i++ {
wgw.Add(1)
go writter(&wgw)
}
wgr.Wait()
queue.Disable()
wgw.Wait()
fmt.Println("用時(shí):", time.Since(t1))
}
func reader(startNum int, wg *sync.WaitGroup) {
for i := 0; i < dataNum; i++ {
suc := queue.PushBack(startNum + i)
for !suc {
suc = queue.PushBack(startNum + i)
}
}
wg.Done()
}
func writter(wg *sync.WaitGroup) {
for {
r, enable := queue.PopFront()
if enable == false {
break
}
if r == defaultVal {
continue
}
}
wg.Done()
}

這種情況下就沒(méi)法測(cè)試無(wú)鎖隊(duì)列了,數(shù)據(jù)都不完整(已驗(yàn)證)。測(cè)試結(jié)果如下,左側(cè)為讀/寫(xiě)協(xié)程數(shù)*dataNum數(shù)據(jù)量(下面讀/寫(xiě)協(xié)程數(shù)為4指總共開(kāi)了8個(gè)協(xié)程):

圖片

添加圖片注釋,不超過(guò) 140 字(可選)

可以看到cas有巨大的性能優(yōu)勢(shì),甚至達(dá)到了3到5倍的性能差距,說(shuō)明這個(gè)思路還是可行的!(先開(kāi)始被chan打擊到了)反倒是自旋鎖的性能最差,這個(gè)倒有些出乎我的意料,按照我的理解在這種頻繁加鎖解鎖的情況下自旋鎖的性能應(yīng)該更好才對(duì),若有知情人士望告知。

分析

為了對(duì)這幾種鎖的性能特點(diǎn)有更深入的分析,這里還補(bǔ)充了幾組測(cè)試,分別用了不同的協(xié)程數(shù)和數(shù)據(jù)量進(jìn)行補(bǔ)充測(cè)試:

圖片

添加圖片注釋,不超過(guò) 140 字(可選)

可以很明顯的看到一個(gè)趨勢(shì)——隨著并發(fā)度增加,自旋鎖的性能急劇下降,由無(wú)并發(fā)時(shí)的與cas性能幾乎一樣到最后與cas將近7倍的效率差。而mutex和cas情況下,隨著并發(fā)度增加,性能影響并不大,下面將前面的測(cè)試數(shù)據(jù)重新組織一下方便對(duì)比:

圖片

添加圖片注釋,不超過(guò) 140 字(可選)

可以看到總數(shù)據(jù)量不變的情況下,并發(fā)協(xié)程數(shù)對(duì)mutex和cas的影響非常小,基本在波動(dòng)范圍以內(nèi)。相較之下自旋鎖就比較慘了。

總結(jié)

**根據(jù)上面的結(jié)果來(lái)說(shuō)的話,當(dāng)實(shí)際競(jìng)爭(zhēng)特別小的時(shí)候,可以考慮用自旋鎖;而并發(fā)大的時(shí)候,用無(wú)鎖隊(duì)列這種結(jié)構(gòu)有很大潛在優(yōu)勢(shì)。**之所以說(shuō)潛在的是因?yàn)槲乙矁H僅是簡(jiǎn)單的實(shí)現(xiàn)某種結(jié)構(gòu),肯定有考慮不全的地方,我寫(xiě)這個(gè)無(wú)鎖例子主要用于測(cè)試,也沒(méi)打算用于實(shí)際場(chǎng)景中。但是我盡量保證了同樣的代碼結(jié)構(gòu)下,最大化各個(gè)鎖結(jié)構(gòu)對(duì)性能的影響。總的來(lái)說(shuō),本文測(cè)試結(jié)果僅作參考,希望能有拋磚引玉的效果。

最后,再附上源碼地址:https://github.com/HandsomeRosin/lockfree

更新:

針對(duì)自旋鎖效率低下的問(wèn)題我仔細(xì)想了想,應(yīng)該是原子操作cas耗時(shí)的問(wèn)題(畢竟在無(wú)并發(fā)情況下,cas和真正不加鎖還是有很大的性能差距)。于是對(duì)自旋鎖的代碼進(jìn)行了微調(diào),減少了CAS的調(diào)用次數(shù):(被注釋掉的是原本的代碼邏輯)

func (spin *spinMutex) lock() {
// for !atomic.CompareAndSwapInt32(&spin.mutex, unlocked, locked) {}
BEGINING:
for spin.mutex != unlocked {}
if !atomic.CompareAndSwapInt32(&spin.mutex, unlocked, locked) {
goto BEGINING
}
}

事實(shí)證明,這樣做效率確實(shí)提高了約1/4,不過(guò)還是改變不了它的大趨勢(shì)(與cas和mutex的性能差距依舊巨大),所以就沒(méi)更新前面的測(cè)試數(shù)據(jù)了。

不過(guò)這也佐證了CAS也是比較耗時(shí)的一個(gè)操作,平時(shí)還是不能肆意使用。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 數(shù)據(jù)
    +關(guān)注

    關(guān)注

    8

    文章

    7256

    瀏覽量

    91833
  • 源碼
    +關(guān)注

    關(guān)注

    8

    文章

    671

    瀏覽量

    30323
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4380

    瀏覽量

    64849
  • CAS
    CAS
    +關(guān)注

    關(guān)注

    0

    文章

    35

    瀏覽量

    15406
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    使用USB進(jìn)行測(cè)量應(yīng)用的優(yōu)勢(shì)潛在危險(xiǎn)

    使用USB進(jìn)行測(cè)量應(yīng)用的優(yōu)勢(shì)潛在危險(xiǎn) 引言:USB用于測(cè)試與測(cè)量應(yīng)用的優(yōu)勢(shì)很多,但是在選擇USB
    發(fā)表于 05-11 21:11 ?371次閱讀

    《有》/《無(wú)》/《簽約》/《解鎖》/《越獄》/《激活》專

    《有》/《無(wú)》/《簽約》/《解鎖》/《越獄》/《激活》專業(yè)技術(shù)詞解析 在討論區(qū)里,大家看到:《有版》,《無(wú)
    發(fā)表于 02-03 11:05 ?1045次閱讀

    AWorks軟件設(shè)計(jì),郵箱、消息隊(duì)列和自旋使用方法

    本文介紹了郵箱、消息隊(duì)列和自旋的使用方法。信號(hào)量只能用于任務(wù)間的同步,不能傳遞更多的信息,為此,AWorks提供了郵箱和消息隊(duì)列服務(wù),它們的主要區(qū)別在于支持的消息長(zhǎng)度不同,在郵箱中,每條消息的長(zhǎng)度固定為4字節(jié),而在消息
    的頭像 發(fā)表于 06-13 09:13 ?1.3w次閱讀
    AWorks軟件設(shè)計(jì),郵箱、消息<b class='flag-5'>隊(duì)列</b>和自旋<b class='flag-5'>鎖</b>使用方法

    智能按鍵出現(xiàn)無(wú)反應(yīng)或禁止操作的原因坤坤智能告訴你

    智能按鍵出現(xiàn)無(wú)反應(yīng)或禁止操作的原因坤坤智能告訴你在日常生活中使用智能時(shí),多多少少會(huì)遇到智能熱鍵無(wú)
    發(fā)表于 12-14 14:47 ?1.2w次閱讀

    利用CAS技術(shù)實(shí)現(xiàn)無(wú)隊(duì)列

    【 導(dǎo)讀 】:本文 主要講解利用CAS技術(shù)實(shí)現(xiàn)無(wú)隊(duì)列。 關(guān)于無(wú)隊(duì)列的實(shí)現(xiàn),網(wǎng)上有很多文章,雖
    的頭像 發(fā)表于 01-11 10:52 ?2545次閱讀
    利用CAS技術(shù)實(shí)現(xiàn)<b class='flag-5'>無(wú)</b><b class='flag-5'>鎖</b><b class='flag-5'>隊(duì)列</b>

    關(guān)于CAS等原子操作介紹 無(wú)隊(duì)列的鏈表實(shí)現(xiàn)方法

    在開(kāi)始說(shuō)無(wú)隊(duì)列之前,我們需要知道一個(gè)很重要的技術(shù)就是CAS操作——Compare & Set,或是 Compare & Swap,現(xiàn)在幾乎所有的CPU指令都支持CAS的原子操作
    的頭像 發(fā)表于 05-18 09:12 ?3819次閱讀
    關(guān)于CAS等原子操作介紹 <b class='flag-5'>無(wú)</b><b class='flag-5'>鎖</b><b class='flag-5'>隊(duì)列</b>的鏈表實(shí)現(xiàn)方法

    怎么設(shè)計(jì)實(shí)現(xiàn)一個(gè)無(wú)高并發(fā)的環(huán)形連續(xù)內(nèi)存緩沖隊(duì)列

    隊(duì)列是一種特殊的線性表,特殊之處在于它只允許在表的前端(front)進(jìn)行刪除操作,而在表的后端(rear)進(jìn)行插入操作,和棧一樣,隊(duì)列是一種操作受限制的線性表。進(jìn)行插入操作的端稱為隊(duì)尾,進(jìn)行刪除操作的端稱為隊(duì)頭
    的頭像 發(fā)表于 02-15 14:59 ?1861次閱讀
    怎么設(shè)計(jì)實(shí)現(xiàn)一個(gè)<b class='flag-5'>無(wú)</b><b class='flag-5'>鎖</b>高并發(fā)的環(huán)形連續(xù)內(nèi)存緩沖<b class='flag-5'>隊(duì)列</b>

    發(fā)燒友實(shí)測(cè) | i.MX8MP 編譯DPDK源碼實(shí)現(xiàn)rte_ring無(wú)環(huán)隊(duì)列進(jìn)程間通信

    作者|donatello1996來(lái)源|電子發(fā)燒友題圖|飛凌嵌入式rte_ring是一個(gè)用CAS實(shí)現(xiàn)的無(wú)FIFO環(huán)形隊(duì)列,支持多消費(fèi)者/生產(chǎn)者同時(shí)出入隊(duì)列,常用于多線程/多進(jìn)程之間的通
    的頭像 發(fā)表于 01-10 16:29 ?2764次閱讀
    發(fā)燒友實(shí)測(cè) | i.MX8MP 編譯DPDK源碼實(shí)現(xiàn)rte_ring<b class='flag-5'>無(wú)</b><b class='flag-5'>鎖</b>環(huán)<b class='flag-5'>隊(duì)列</b>進(jìn)程間通信

    無(wú)源智能的應(yīng)用前景

    ,但應(yīng)用前景廣闊。無(wú)源智能的發(fā)展優(yōu)勢(shì):1.政策支持:近年來(lái),國(guó)家大力推進(jìn)物聯(lián)網(wǎng)、大數(shù)據(jù)、新能源的發(fā)展,并且陸續(xù)出臺(tái)各項(xiàng)產(chǎn)業(yè)政策,引導(dǎo)智能行業(yè)有序化、高端化發(fā)展,
    的頭像 發(fā)表于 09-22 10:18 ?2497次閱讀
    <b class='flag-5'>無(wú)</b>源智能<b class='flag-5'>鎖</b>的應(yīng)用前景

    無(wú)源智能系統(tǒng)之水務(wù)消防

    無(wú)源智能系統(tǒng)之水務(wù)消防
    的頭像 發(fā)表于 05-22 09:48 ?670次閱讀
    <b class='flag-5'>無(wú)</b>源智能<b class='flag-5'>鎖</b>系統(tǒng)之水務(wù)消防

    固態(tài)電池(SSBs)的潛在優(yōu)勢(shì)

    與用于日常手機(jī)和電動(dòng)汽車的傳統(tǒng)鋰離子電池相比,固態(tài)電池(SSBs)具有重要的潛在優(yōu)勢(shì)
    發(fā)表于 09-25 09:28 ?1161次閱讀
    固態(tài)電池(SSBs)的<b class='flag-5'>潛在</b><b class='flag-5'>優(yōu)勢(shì)</b>

    如何實(shí)現(xiàn)一個(gè)多讀多寫(xiě)的線程安全的無(wú)隊(duì)列

    在ZMQ無(wú)隊(duì)列的原理與實(shí)現(xiàn)一文中,我們已經(jīng)知道了ypipe可以實(shí)現(xiàn)一線程寫(xiě)一線程讀的無(wú)隊(duì)列
    的頭像 發(fā)表于 11-08 15:25 ?1996次閱讀
    如何實(shí)現(xiàn)一個(gè)多讀多寫(xiě)的線程安全的<b class='flag-5'>無(wú)</b><b class='flag-5'>鎖</b><b class='flag-5'>隊(duì)列</b>

    無(wú)隊(duì)列解決的問(wèn)題

    為什么需要無(wú)隊(duì)列 無(wú)隊(duì)列解決了什么問(wèn)題?無(wú)
    的頭像 發(fā)表于 11-10 15:33 ?1346次閱讀
    <b class='flag-5'>無(wú)</b><b class='flag-5'>鎖</b><b class='flag-5'>隊(duì)列</b>解決的問(wèn)題

    無(wú)CAS如何實(shí)現(xiàn)各種無(wú)的數(shù)據(jù)結(jié)構(gòu)

    ,可用于在多線程編程中實(shí)現(xiàn)不被打斷的數(shù)據(jù)交換操作,從而避免多線程同時(shí)改寫(xiě)某?數(shù)據(jù)時(shí)由于執(zhí)行順序不確定性以及中斷的不可預(yù)知性產(chǎn)?的數(shù)據(jù)不一致問(wèn)題 有了CAS,我們就可以用它來(lái)實(shí)現(xiàn)各種無(wú)(lock free)的數(shù)據(jù)結(jié)構(gòu) 實(shí)現(xiàn)原理 該操作通過(guò)將內(nèi)存中的值與指定數(shù)據(jù)進(jìn)行比較,
    的頭像 發(fā)表于 11-13 15:38 ?1252次閱讀
    <b class='flag-5'>無(wú)</b><b class='flag-5'>鎖</b>CAS如何實(shí)現(xiàn)各種<b class='flag-5'>無(wú)</b><b class='flag-5'>鎖</b>的數(shù)據(jù)結(jié)構(gòu)

    無(wú)源智能電子柜設(shè)備:開(kāi)啟智能管理新時(shí)代

    一、引言 在當(dāng)今數(shù)字化、智能化飛速發(fā)展的時(shí)代,傳統(tǒng)的機(jī)械鎖具已逐漸無(wú)法滿足人們對(duì)安全性、便捷性和高效管理的需求。無(wú)源智能電子柜設(shè)備應(yīng)運(yùn)而生,它憑借其獨(dú)特的優(yōu)勢(shì),正在廣泛應(yīng)用于各個(gè)領(lǐng)域,成為提升管理
    的頭像 發(fā)表于 04-08 18:16 ?443次閱讀