當(dāng)前位置:首頁 > 公眾號(hào)精選 > CPP開發(fā)者
[導(dǎo)讀]之前整理過一篇C20新特性的文章全網(wǎng)首發(fā)??!C20新特性全在這一張圖里了,里面提到過latch、barrier和semaphore,但是沒有詳細(xì)介紹過三者的作用和區(qū)別,這里詳細(xì)介紹下。latch這個(gè)可能大多數(shù)人都有所了解,這就是我們經(jīng)常會(huì)用到的CountDownLatch。用于使...

之前整理過一篇C 20新特性的文章全網(wǎng)首發(fā)??!C 20新特性全在這一張圖里了,里面提到過latch、barrier和semaphore,但是沒有詳細(xì)介紹過三者的作用和區(qū)別,這里詳細(xì)介紹下。

latch

這個(gè)可能大多數(shù)人都有所了解,這就是我們經(jīng)常會(huì)用到的CountDownLatch。用于使一個(gè)線程先阻塞,等待其他線程完成各自的工作后再繼續(xù)執(zhí)行。

CountDownLatch是通過計(jì)數(shù)器實(shí)現(xiàn),計(jì)數(shù)器的初始值為線程的數(shù)量。每當(dāng)一個(gè)線程完成了自己的任務(wù)后,計(jì)數(shù)器的值就會(huì)減1。當(dāng)計(jì)數(shù)器值到達(dá)0時(shí),它表示所有的線程已經(jīng)完成了任務(wù),然后等待的線程就可以打斷阻塞去繼續(xù)執(zhí)行任務(wù)。

自己之前實(shí)現(xiàn)過一個(gè)CountDownLatch,源碼大概這樣:

CountDownLatch::CountDownLatch(int32_t?count)?:?count_(count)?{}

void?CountDownLatch::CountDown()?{??
????std::unique_lock?lock(mutex_);????
????--count_;????
????if?(count_?==?0)?{???????
????????cv_.notify_all();???
????}
}
void?CountDownLatch::Await(int32_t?time_ms)?{???
????std::unique_lock?lock(mutex_);????
????while?(count_?>?0)?{???????
????????if?(time_ms?>?0)?{????????
????????????cv_.wait_for(lock,?std::chrono::milliseconds(time_ms));???????
????????}?else?{???????????
????????????cv_.wait(lock);???????
????????}???
????}
}

int32_t?CountDownLatch::GetCount()?const?{???
????std::unique_lock?lock(mutex_);?
????return?count_;
}

barrier

許多線程在阻塞點(diǎn)阻塞,當(dāng)?shù)竭_(dá)阻塞點(diǎn)的線程達(dá)到一定數(shù)量時(shí),會(huì)執(zhí)行完成的回調(diào),然后解除所有相關(guān)線程的阻塞,然后重置線程計(jì)數(shù)器,繼續(xù)開始下一階段的阻塞。

假設(shè)有很多線程并發(fā)執(zhí)行,并在一個(gè)循環(huán)中執(zhí)行一些計(jì)算。進(jìn)一步假設(shè)一旦這些計(jì)算完成,需要在線程開始其循環(huán)的新迭代之前對(duì)結(jié)果進(jìn)行一些處理。

看以下示例代碼(摘自cppreference):

#include?
#include?
#include?
#include?
#include??

int?main()?{??
??const?auto?workers?=?{?"anil",?"busara",?"carl"?};???
??
??auto?on_completion?=?[]()?noexcept?{????
????//?locking?not?needed?here????
????static?auto?phase?=?"...?done\n"?"Cleaning?up...\n";????
????std::cout?<????phase?=?"...?done\n";??
??};??
??std::barrier?sync_point(std::ssize(workers),?on_completion);??
??
??auto?work?=?[
本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
關(guān)閉
關(guān)閉