成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

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

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

[[428229]]

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

之前我整理過一篇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,源碼大概這樣:

  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

許多線程在阻塞點(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):

  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

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

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

release():遞增計(jì)數(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 

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

 

打完收工。

 

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

2024-01-19 21:07:22

C++20Concepts函數(shù)

2024-12-18 11:30:00

C++20比較運(yùn)算符

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

2024-08-13 08:30:13

2014-02-17 10:54:13

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

2020-12-21 21:05:29

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

2023-11-15 15:54:17

C++運(yùn)算符

2021-03-05 18:38:45

ESvue項(xiàng)目

2020-02-03 13:55:49

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

2024-10-21 07:05:14

C#特性語言

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計(jì)算
點(diǎn)贊
收藏

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

主站蜘蛛池模板: 国产成人免费一区二区60岁 | 欧美日韩精品久久久免费观看 | 亚洲一区 | 在线播放中文字幕 | 成人国产精品入口免费视频 | 岛国二区 | 小草久久久久久久久爱六 | 国产精品美女在线观看 | 国产精品美女久久久久久久网站 | www.伊人.com | 免费成人高清 | 一级黄a视频 | 日韩电影免费在线观看中文字幕 | 在线观看免费av网 | 久久久久亚洲精品 | 成人久久久久 | 国产精品三级久久久久久电影 | 中文欧美日韩 | 欧美在线观看一区二区 | 久久一二区 | 国产人免费人成免费视频 | 在线精品亚洲欧美日韩国产 | 久久69精品久久久久久久电影好 | av日韩高清| 蜜桃精品视频在线 | 一区二区在线免费观看 | 成人精品免费视频 | 久久精品成人一区 | 9久9久9久女女女九九九一九 | 久久久看 | 中文字幕三区 | 麻豆91精品91久久久 | 99亚洲视频 | 国产在线不卡视频 | 中文欧美日韩 | 亚洲国产一区二区视频 | 丁香久久 | 在线色 | 日韩av福利在线观看 | 国产成人免费在线观看 | 精品国产免费一区二区三区演员表 |