C 20?新特性的小細節(jié)
時間:2021-10-27 13:47:17
手機看文章
掃描二維碼
隨時隨地手機看文章
[導讀]之前整理過一篇C20新特性的文章全網首發(fā)?。20新特性全在這一張圖里了,里面提到過latch、barrier和semaphore,但是沒有詳細介紹過三者的作用和區(qū)別,這里詳細介紹下。latch這個可能大多數人都有所了解,這就是我們經常會用到的CountDownLatch。用于使...
之前整理過一篇C 20新特性的文章全網首發(fā)?。 20新特性全在這一張圖里了,里面提到過latch、barrier和semaphore,但是沒有詳細介紹過三者的作用和區(qū)別,這里詳細介紹下。
latch
這個可能大多數人都有所了解,這就是我們經常會用到的CountDownLatch。用于使一個線程先阻塞,等待其他線程完成各自的工作后再繼續(xù)執(zhí)行。CountDownLatch是通過計數器實現,計數器的初始值為線程的數量。每當一個線程完成了自己的任務后,計數器的值就會減1。當計數器值到達0時,它表示所有的線程已經完成了任務,然后等待的線程就可以打斷阻塞去繼續(xù)執(zhí)行任務。自己之前實現過一個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
許多線程在阻塞點阻塞,當到達阻塞點的線程達到一定數量時,會執(zhí)行完成的回調,然后解除所有相關線程的阻塞,然后重置線程計數器,繼續(xù)開始下一階段的阻塞。假設有很多線程并發(fā)執(zhí)行,并在一個循環(huán)中執(zhí)行一些計算。進一步假設一旦這些計算完成,需要在線程開始其循環(huá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?=?[ 




