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

C++20新特性的小細節,你掌握了嗎?

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

[[428229]]

本文轉載自微信公眾號「程序喵大人」,作者程序喵大人。轉載本文請聯系程序喵大人公眾號。

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

latch

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

CountDownLatch是通過計數器實現,計數器的初始值為線程的數量。每當一個線程完成了自己的任務后,計數器的值就會減1。當計數器值到達0時,它表示所有的線程已經完成了任務,然后等待的線程就可以打斷阻塞去繼續執行任務。

自己之前實現過一個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

許多線程在阻塞點阻塞,當到達阻塞點的線程達到一定數量時,會執行完成的回調,然后解除所有相關線程的阻塞,然后重置線程計數器,繼續開始下一階段的阻塞。

假設有很多線程并發執行,并在一個循環中執行一些計算。進一步假設一旦這些計算完成,需要在線程開始其循環的新迭代之前對結果進行一些處理。

看以下示例代碼(摘自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

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

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

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

示例代碼如下:

  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 

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

 

打完收工。

 

責任編輯:武曉燕 來源: 程序喵大人
相關推薦

2024-01-19 21:07:22

C++20Concepts函數

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編程語言開發

2024-02-05 22:13:50

C++C++20開發

2023-11-04 20:00:02

C++20協程

2010-08-04 15:01:00

2024-08-13 08:30:13

2014-02-17 10:54:13

PostgreSQL數據庫

2024-12-05 08:13:18

2023-11-15 15:54:17

C++運算符

2020-12-21 21:05:29

C++C++20標準草案

2021-03-05 18:38:45

ESvue項目

2020-02-03 13:55:49

技術研發指標

2024-10-21 07:05:14

C#特性語言

2024-05-17 08:42:52

AttributeMyClass方法

2023-08-08 08:08:42

PythonWeb開發

2023-11-20 22:19:10

C++static

2013-06-09 16:26:56

Windows 8.1
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 日韩亚洲欧美一区 | 欧美日韩视频在线第一区 | 午夜欧美| 精品久久久久久 | 亚洲黄色高清视频 | 欧美在线视频观看 | av超碰| 一级黄色绿像片 | 国产成人精品一区二区三区在线 | 成人一区在线观看 | 日韩欧美国产一区二区三区 | 在线免费观看亚洲 | 日本久久久久久 | 午夜视频在线免费观看 | 97视频在线观看免费 | 国产精品美女久久久久久免费 | 亚洲成人久久久 | 久久久av | 五月婷婷导航 | 日韩三级在线观看 | 欧美一区二区三区 | 日韩欧美在线视频 | 久久网站免费视频 | 国产a一区二区 | 欧美日韩中文字幕在线播放 | 精品影院 | 国产中文字幕在线 | 亚洲xxxxx | 久久国产精彩视频 | www.99re5.com| 久久久精彩视频 | 亚洲人成人一区二区在线观看 | 成人无遮挡毛片免费看 | 久久三区 | 一区二区三区久久久 | 久久新视频 | 偷牌自拍 | 欧美激情在线观看一区二区三区 | 华人黄网站大全 | 亚洲精品在线视频 | 国产1区 |