国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

C++20新特性的小細(xì)節(jié),你掌握了嗎?

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

[[428229]]

本文轉(zhuǎn)載自微信公眾號「程序喵大人」,作者程序喵大人。轉(zhuǎn)載本文請聯(lián)系程序喵大人公眾號。

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

latch

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

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

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

  1. CountDownLatch::CountDownLatch(int32_t count) : count_(count) {} 
  2.  
  3. void CountDownLatch::CountDown() { 
  4.     std::unique_lock<std::mutex> lock(mutex_); 
  5.     --count_; 
  6.     if (count_ == 0) { 
  7.         cv_.notify_all(); 
  8.     } 
  9.  
  10. void CountDownLatch::Await(int32_t time_ms) { 
  11.     std::unique_lock<std::mutex> lock(mutex_); 
  12.     while (count_ > 0) { 
  13.         if (time_ms > 0) { 
  14.             cv_.wait_for(lock, std::chrono::milliseconds(time_ms)); 
  15.         } else { 
  16.             cv_.wait(lock); 
  17.         } 
  18.     } 
  19.  
  20. int32_t CountDownLatch::GetCount() const { 
  21.     std::unique_lock<std::mutex> lock(mutex_); 
  22.     return count_; 

barrier

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

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

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

  1. #include <barrier> 
  2. #include <iostream> 
  3. #include <string> 
  4. #include <thread> 
  5. #include <vector> 
  6.   
  7. int main() { 
  8.   const auto workers = { "anil""busara""carl" }; 
  9.   
  10.   auto on_completion = []() noexcept {  
  11.     // locking not needed here 
  12.     static auto phase = "... done\n" "Cleaning up...\n"
  13.     std::cout << phase; 
  14.     phase = "... done\n"
  15.   }; 
  16.   std::barrier sync_point(std::ssize(workers), on_completion); 
  17.   
  18.   auto work = [&](std::string name) { 
  19.     std::string product = "  " + name + " worked\n"
  20.     std::cout << product;  // ok, op<< call is atomic 
  21.     sync_point.arrive_and_wait(); 
  22.   
  23.     product = "  " + name + " cleaned\n"
  24.     std::cout << product; 
  25.     sync_point.arrive_and_wait(); 
  26.   }; 
  27.   
  28.   std::cout << "Starting...\n"
  29.   std::vector<std::thread> threads; 
  30.   for (auto const& worker : workers) { 
  31.     threads.emplace_back(work, worker); 
  32.   } 
  33.   for (auto& thread : threads) { 
  34.     thread.join(); 
  35.   } 

可能的輸出如下:

  1. Starting... 
  2.   anil worked 
  3.   carl worked 
  4.   busara worked 
  5. ... done 
  6. Cleaning up... 
  7.   busara cleaned 
  8.   carl cleaned 
  9.   anil cleaned 
  10. ... done 

semaphore

信號量,這個估計大家都很熟悉,本質(zhì)也是個計數(shù)器,主要有兩個方法:

acquire():遞減計數(shù)器,當(dāng)計數(shù)器為零時阻塞,直到計數(shù)器再次遞增。

release():遞增計數(shù)器(可傳遞具體數(shù)字),并解除在acquire調(diào)用中的線程的阻塞。

示例代碼如下:

  1. #include <iostream> 
  2. #include <thread> 
  3. #include <chrono> 
  4. #include <semaphore> 
  5.  
  6. std::binary_semaphore 
  7.   smphSignalMainToThread(0), 
  8.   smphSignalThreadToMain(0); 
  9.   
  10. void ThreadProc() {   
  11.   smphSignalMainToThread.acquire(); 
  12.   std::cout << "[thread] Got the signal\n"; // response message 
  13.   using namespace std::literals; 
  14.   std::this_thread::sleep_for(3s); 
  15.   
  16.   std::cout << "[thread] Send the signal\n"; // message 
  17.   smphSignalThreadToMain.release(); 
  18.   
  19. int main() { 
  20.   std::thread thrWorker(ThreadProc); 
  21.   std::cout << "[main] Send the signal\n"; // message 
  22.   
  23.   smphSignalMainToThread.release(); 
  24.   
  25.   smphSignalThreadToMain.acquire(); 
  26.   
  27.   std::cout << "[main] Got the signal\n"; // response message 
  28.   thrWorker.join(); 
  29. 輸出如下: 
  30. [main] Send the signal 
  31. [thread] Got the signal 
  32. [thread] Send the signal 
  33. [main] Got the signal 

信號量也可以當(dāng)作條件變量使用,這個我估計大家應(yīng)該知道怎么做。

 

打完收工。

 

責(zé)任編輯:武曉燕 來源: 程序喵大人
相關(guān)推薦

2024-01-19 21:07:22

C++20Concepts函數(shù)

2024-12-18 11:30:00

C++20比較運算符

2025-06-26 02:00:00

2020-01-10 15:44:50

編程語言C++Java

2020-10-14 07:52:36

ES11編程語言開發(fā)

2024-02-05 22:13:50

C++C++20開發(fā)

2023-11-04 20:00:02

C++20協(xié)程

2010-08-04 15:01:00

2024-12-05 08:13:18

2023-11-15 15:54:17

C++運算符

2014-02-17 10:54:13

PostgreSQL數(shù)據(jù)庫

2024-08-13 08:30:13

2020-12-21 21:05:29

C++C++20標(biāo)準(zhǔn)草案

2021-03-05 18:38:45

ESvue項目

2024-10-21 07:05:14

C#特性語言

2020-02-03 13:55:49

技術(shù)研發(fā)指標(biāo)

2024-05-17 08:42:52

AttributeMyClass方法

2023-08-08 08:08:42

PythonWeb開發(fā)

2023-11-20 22:19:10

C++static

2024-03-20 08:31:40

KotlinExtension計算
點贊
收藏

51CTO技術(shù)棧公眾號

18成人在线| 日本一区免费| 在线视频三区| 不卡在线视频中文字幕| 国产成人高清激情视频在线观看| 成人ssswww在线播放| 亚洲成人一区二区| 国产女大学生av| 日韩国产精品久久| 国产美女精品视频免费观看| 日本精品在线一区| 欧美亚洲高清一区| 丝袜美女写真福利视频| 国产99精品国产| 视频在线精品一区| 欧美日韩 国产精品| 国产成人精品视频| 国产一区二区三区国产精品| 欧美精品一区二区在线观看| 嫩草在线播放| 亚洲精品中文字幕乱码三区 | 日韩av中文字幕在线免费观看| 一级网站免费观看| 国产视频一区二区三区在线观看| 久久蜜桃av一区精品变态类天堂| 亚洲sss综合天堂久久| 国产最新精品| 国产高清不卡| 国产中文精品久高清在线不| 欧美一区二区三区播放老司机| 51成人做爰www免费看网站| 综合久久2o19| 久久久久久久久久久久久久一区 | 国产精品99久久久久久有的能看 | 成人激情黄色网| 九热爱视频精品视频| 久久久视频在线| 成人午夜888| 久久精品小视频| 欧洲亚洲精品久久久久| 久久夜色撩人精品| 国产精品对白| 国产精品99久久99久久久二8| 红杏aⅴ成人免费视频| 2018国产精品视频| 精品视频黄色| 91网站在线看| 亚洲区欧美区| 亚洲国产午夜伦理片大全在线观看网站| 性感少妇一区| 中文字幕日韩精品久久| 国产高清精品久久久久| 日本国产在线播放| 国产婷婷色一区二区三区| 国产精品美女一区二区在线观看| 成人黄色av网址| 色综合久久天天| 成人在线免费观看| 91精品国产91综合久久蜜臀| 污污影院在线观看| 日韩成人在线视频观看| 国产精品第一| 久久手机精品视频| 激情亚洲另类图片区小说区| 欧美性在线观看| 欧美精品黄色| 亚洲午夜激情| 不卡视频免费播放| 东北一级毛片| 欧美一区二区三区在线电影| 日韩性xxx| 日韩美女在线观看| 一本不卡影院| 欧美日韩精品在线一区二区 | 久久av资源站| 在线亚洲一区二区| 91久久久久| 免费在线观看污视频| 国产在线播放一区| 亚洲一二三区av| 欧美日韩另类在线| 亚洲精品88| 国产91|九色| 亚洲尤物影院| 日本xxxxxxx免费视频| 亚洲黄色片在线观看| 国产高清自拍视频在线观看| 亚洲丝袜在线视频| 99精品视频免费观看视频| 日本在线播放不卡| 成人美女视频在线观看18| 99在线免费观看| 97碰碰碰免费色视频| 日韩中文字幕精品视频| 成人高潮视频| 强伦女教师2:伦理在线观看| 亚洲一区二区三区在线看| av中文字幕在线观看| 国产自产女人91一区在线观看| 99精品热视频| 欧美电影在线观看网站| 一区二区av| 欧美体内谢she精2性欧美| 91麻豆精品国产综合久久久| 伊人久久大香线蕉成人综合网| 亚洲一卡二卡三卡四卡无卡久久| 深夜福利视频一区二区| 国产精品一区二区三区精品| 国产亚洲精品bt天堂精选| 日韩精品极品| 亚洲最大免费| 亚洲女人天堂成人av在线| 久久九九精品| 日韩免费va| 午夜免费电影一区在线观看| 精品国产自在久精品国产| 久热成人在线视频| 草莓视频丝瓜在线观看丝瓜18| 国产91在线视频| 亚洲综合av一区二区三区| 成人字幕网zmw| 夜夜嗨av一区二区三区四季av| 国产在线成人| 日韩精品免费一区二区三区竹菊| 精品国产乱码久久久久久闺蜜| 免费看日本一区二区| www.午夜色| 欧美性开放视频| 污视频网站免费| 成年在线电影| 青青青在线观看视频| 91精品国产综合久久精品性色 | 亚洲精品一卡二卡三卡四卡| 欧美午夜精品免费| 亚洲看片免费| 欧美性xxxxxxxx| 亚洲区小说区| 欧美日本视频在线观看| 亚洲成人a级网| 亚洲永久免费精品| 国产在线视频网| 国产精品视频永久免费播放| 成人福利电影精品一区二区在线观看| 污污的视频在线观看| 国产免费高清一区| 色婷婷综合久久久中文字幕| 国产精品中文字幕亚洲欧美| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲精品护士| 毛片在线看网站| 亚洲欧美在线播放| 亚洲综合精品| a√资源在线| 亚洲精品欧美极品| 欧美日韩一区二区免费视频| 国产欧美日韩精品一区二区三区| 欧美一级特黄a| 欧美日韩国产成人| 中文字幕成人av| 国产66精品| 久久国产精品久久久久久电车| 99精品国产福利在线观看免费 | 久久福利视频导航| 国产一区二区三区高清播放| 特级毛片在线| 青青草国产精品| 日韩精品中文字幕在线一区| 日韩专区欧美专区| 99在线视频影院| 免费人成自慰网站| 欧美国产乱视频| aaaa欧美| 日韩中文字幕高清在线观看| 成人台湾亚洲精品一区二区| 国产视频欧美视频| 欧美新色视频| 日本天码aⅴ片在线电影网站| 国产小视频免费在线网址| 日韩国产欧美区| 捆绑调教美女网站视频一区| 超碰在线网站| 影音先锋成人资源网站| 亚洲人a成www在线影院| 99久久国产综合色|国产精品| 国产色99精品9i| 四虎4hu新地址入口2023| 激情丁香综合五月| 黑人巨大国产9丨视频| 最近2019中文字幕第三页视频| 久久久精品tv| 欧美韩日高清| 啦啦啦中文在线观看日本| 青青草精品视频在线| 欧美1级片网站| 国产精品久久久久天堂| 99久久九九| 日本999视频| 51精品国产人成在线观看| 国产美女久久久久| 亚洲偷熟乱区亚洲香蕉av|