C++11QT復習 (十九)

文章目錄

    • Day13 C++ 時間庫和線程庫學習筆記(Chrono 與 Thread)
      • 一、時間庫 `<chrono>`
        • 1.1 基本概念
        • 1.2 使用示例
        • 1.3 duration 字面量單位
      • 二、線程庫 `<thread>`
        • 2.1 基本用法
        • 2.2 數據競爭(Race Condition)
        • 2.3 加鎖:互斥鎖 `std::mutex`
        • 2.4 示例:單線程與多線程性能對比
          • 單線程版本
          • 多線程 + 共享內存(未加鎖)
          • 多線程 + 加鎖
          • 優化版:每線程局部求和后再加總(鎖移出循環)
      • 三、線程安全總結
      • 四、調試建議
      • 五、參考資源

Day13 C++ 時間庫和線程庫學習筆記(Chrono 與 Thread)

一、時間庫 <chrono>

1.1 基本概念

C++ 的 <chrono> 時間庫中包含三個核心概念:

  • Clock(時鐘):提供當前時間的來源,常用的有:
    • system_clock:系統時間,可轉換為 time_t 類型(適合打印日志)
    • steady_clock:單調時鐘,適合測量時間間隔(不受系統時間修改影響)
    • high_resolution_clock:高精度時鐘,底層通常等同于 steady_clock
  • time_point(時間點):代表某個時鐘上的具體時刻。
  • duration(時間段):表示兩個時間點之間的時間差。
1.2 使用示例
#include <chrono>
#include <iostream>
#include <ctime>
#include <thread>void wait_or_sleep_for_or_until() {using namespace std::chrono_literals; // 支持 1s, 10ms 等單位std::this_thread::sleep_for(1s); // 睡眠1秒(使用 duration 類型)std::this_thread::sleep_until(std::chrono::high_resolution_clock::now() + 1s); // 睡眠到某時間點
}void calculate_execution_time() {auto before = std::chrono::high_resolution_clock::now();// 執行某段代碼auto after = std::chrono::high_resolution_clock::now();auto elapsed = std::chrono::duration_cast<std::chrono::milliseconds>(after - before);std::cout << "Elapsed: " << elapsed.count() << " ms\n";
}int main() {auto now = std::chrono::system_clock::now();std::time_t now_c = std::chrono::system_clock::to_time_t(now);std::cout << "Current time: " << std::ctime(&now_c);
}
1.3 duration 字面量單位

使用 std::chrono_literals 命名空間后支持:

  • h, min, s, ms, us, ns

二、線程庫 <thread>

2.1 基本用法

創建線程的方式:

std::thread t(func); // 執行 func()
t.join();  // 等待線程結束
t.detach(); // 讓線程獨立運行,主線程不再等待

線程函數可以使用 lambda 表達式,支持傳入引用:

int x = 10;
std::thread t([&x] { x += 5; });
t.join();
2.2 數據競爭(Race Condition)

多個線程同時修改共享變量(如 sum)會引發數據競爭,結果不確定。

2.3 加鎖:互斥鎖 std::mutex
std::mutex mtx;
mtx.lock();
sum += value;
mtx.unlock();

推薦使用 std::lock_guard 實現 RAII 風格的自動加鎖解鎖:

std::lock_guard<std::mutex> lock(mtx);
sum += value; // 自動解鎖
2.4 示例:單線程與多線程性能對比
單線程版本
void single_thread() {auto data = generate_data();unsigned long long sum = 0;Timer clock;for (const auto& array : data) {for (int i : array) {// 計算密集操作(模擬)sum += i;}}std::cout << "single_thread: " << clock.duration() << " sum: " << sum << "\n";
}
多線程 + 共享內存(未加鎖)
void race_condition_of_shared_memory() {unsigned long long sum = 0;std::vector<std::thread> threads;for (const auto& array : data) {threads.emplace_back([&] {for (int i : array) sum += i; // 存在數據競爭!});}for (auto& t : threads) t.join();
}
多線程 + 加鎖
void mutex_version() {std::mutex mtx;unsigned long long sum = 0;for (...) {threads.emplace_back([&] {for (...) {std::lock_guard<std::mutex> lock(mtx);sum += i;}});}
}
優化版:每線程局部求和后再加總(鎖移出循環)
void mutex_out_of_loop() {std::mutex mtx;unsigned long long sum = 0;for (...) {threads.emplace_back([&] {unsigned long long local_sum = 0;for (...) local_sum += i;std::lock_guard<std::mutex> lock(mtx);sum += local_sum;});}
}

三、線程安全總結

方案是否安全性能說明
單線程安全無并發
多線程(無加鎖)不安全快但錯誤數據競爭
多線程 + 每次加鎖安全鎖粒度太小
多線程 + 聚合后加鎖安全推薦方案,鎖粒度大、代價低

四、調試建議

  • 建議使用 Debug 模式運行,避免 release 模式優化導致時間測不準。
  • 保持線程 join/detach 的正確性,避免程序異常終止。
  • 避免棧內存分配超大數組,可使用 std::vector<std::array<>> 放在堆上。

五、參考資源

  • zhihu chrono 詳解
  • C++ Concurrency In Action (書籍)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/76204.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/76204.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/76204.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

C++初階-C++的講解1

目錄 1.缺省(sheng)參數 2.函數重載 3.引用 3.1引用的概念和定義 3.2引用的特性 3.3引用的使用 3.4const引用 3.5.指針和引用的關系 4.nullptr 5.總結 1.缺省(sheng)參數 &#xff08;1&#xff09;缺省參數是聲明或定義是為函數的參數指定一個缺省值。在調用該函數是…

Redisson 實現分布式鎖

在平常的開發工作中&#xff0c;我們經常會用到鎖&#xff0c;那么鎖有什么用呢&#xff1f;鎖主要是控制對共享資源的訪問順序&#xff0c;防止多個線程并發操作導致數據不一致的問題。經常可能會聽到樂觀鎖、悲觀鎖、分布式鎖、行鎖、表鎖等等&#xff0c;那么我們今天總結下…

環境—Ubuntu24(py3.12)安裝streamlit(虛擬環境py3.9)

請盡可能不用Ubuntu24請直接跳7.查看解決方案 Action Log 在Ubuntu 24.04中更換為清華源的步驟【Bug】Python 3.12 on Ubuntu 24.04 is Externally Managed - PIP is broken 相關解決方案 從 Ubuntu 24.04 開始&#xff0c;有兩個選項&#xff1a; 1. install python pacakg…

【C++進階】關聯容器:set類型

目錄 一、set 基本概念 1.1 定義與特點 1.2 頭文件與聲明 1.3 核心特性解析 二、set 底層實現 2.1 紅黑樹簡介 2.2 紅黑樹在 set 中的應用 三、set 常用操作 3.1 插入元素 3.2 刪除元素 3.3 查找元素 3.4 遍歷元素 3.5 性能特征 四、set 高級應用 4.1 自定義比較…

[漏洞篇]SSRF漏洞詳解

[漏洞篇]SSRF漏洞詳解 免責聲明&#xff1a; 本文主要講解漏洞原理&#xff0c;以及防御手段&#xff0c;旨在幫助大家更好的了解漏洞危害&#xff0c;以及開發中所需要的點&#xff0c;切勿拿來做違法事情&#xff0c;否則后果自負。 一、介紹 概念 SSRF&#xff1a;服務端請…

nuscenes數據集分析

nuscenes數據集分析 標注與總體介紹 nuscenes包含有相機、激光雷達、毫米波雷達、IMU與GPS等設備提供的數據。它的數據采集了1000個場景&#xff0c;每個場景大約有20s&#xff0c;針對目標檢測任務&#xff0c;對23類物體進行標注&#xff0c;且以2Hz的頻率提供精確的三維目標…

JavaScript學習教程,從入門到精通,JavaScript 運算符及語法知識點詳解(8)

JavaScript 運算符及語法知識點詳解 一、JavaScript 運算符 1. 算術運算符 用于執行數學運算&#xff1a; 加法- 減法* 乘法/ 除法% 取模&#xff08;余數&#xff09; 遞增-- 遞減** 冪運算&#xff08;ES6&#xff09; let a 10, b 3; console.log(a b); // 13 conso…

Shell腳本的學習

編寫腳本文件 定義以開頭&#xff1a;#!/bin/bash #!用來聲明腳本由什么shell解釋&#xff0c;否則使用默認shel 第一步&#xff1a;編寫腳本文件 #!/bin/bash #注釋 echo "這是輸出" 第二步&#xff1a;加上執行權限&#xff1a;chmod x 腳本文件名.sh 第三步&…

在線PDF文件拆分工具,小白工具功能實用操作簡單,無需安裝的文檔處理工具

小白工具中的在線 PDF 文件拆分工具是一款功能實用、操作便捷的文檔處理工具&#xff0c;以下是其具體介紹&#xff1a; 操作流程 上傳 PDF 文檔&#xff1a;打開小白工具在線PDF文件拆分工具 - 快速、免費拆分PDF文檔 - 小白工具的在線 PDF 文件拆分頁面&#xff0c;通過點擊 …

數字的乘階運算

求數字的乘階&#xff1a; 例如&#xff1a;6的乘階運算&#xff1a;6*5*4*3*2*1 例如&#xff1a;3的乘階運算&#xff1a;3*2*1 class Program{static void Main(string[] args){Console.WriteLine("請輸入數字&#xff1a;");int num_01 Convert.ToInt32 (Con…

tcp/ip攻擊及防范

作為高防工程師&#xff0c;我每天攔截數以萬計的惡意流量&#xff0c;其中TCP/IP協議層攻擊是最隱蔽、最具破壞性的威脅之一。常見的攻擊手法包括&#xff1a; 1. SYN Flood攻擊&#xff1a;攻擊者發送大量偽造的SYN包&#xff0c;耗盡服務器連接資源&#xff0c;導致正常用…

C++類成員內存分布詳解

本文將探討C類中成員變量的內存分布情況&#xff0c;包括普通成員、靜態成員、虛函數等不同情況下的內存布局。 一、基本成員內存布局 1. 普通成員變量 普通成員變量按照聲明順序在內存中連續排列&#xff08;受訪問修飾符和內存對齊影響&#xff09;&#xff1a; class Nor…

計算機視覺——為什么 mAP 是目標檢測的黃金標準

概述 在目標檢測領域&#xff0c;有一個指標被廣泛認為是衡量模型性能的“黃金標準”&#xff0c;它就是 mAP&#xff08;Mean Average Precision&#xff0c;平均精確率均值&#xff09;。如果你曾經接觸過目標檢測模型&#xff08;如 YOLO、Faster R-CNN 或 SSD&#xff09;…

C語言單鏈表的增刪改補

目錄 &#xff08;一&#xff09;單鏈表的結構定義及初始化 (二)單鏈表的尾插&#xff0c;頭插 (三)單鏈表的尾刪&#xff0c;頭刪 (四)單鏈表的查找&#xff0c;刪除&#xff0c;銷毀 單鏈表是數據結構課程里的第二個數據結構。單鏈表在邏輯結構是連續的&#xff0c;在物理…

Android10.0 framework第三方無源碼APP讀寫斷電后數據丟失問題解決

1.前言 在10.0中rom定制化開發中,在某些產品開發中,在某些情況下在App用FileOutputStream讀寫完畢后,突然斷電 會出現寫完的數據丟失的問題,接下來就需要分析下關于使用FileOutputStream讀寫數據的相關流程,來實現相關 功能 2.framework第三方無源碼APP讀寫斷電后數據丟…

殺戮尖塔(Slay The Spire) 的全新角色模組 - 女巫

女巫&#xff08;The Witch&#xff09; 殺戮尖塔&#xff08;Slay The Spire&#xff09; 的全新角色模組 女巫模組為游戲增添了超過 75 張新卡牌和 4 個全新遺物&#xff0c;圍繞 詛咒&#xff08;Curses&#xff09; 展開獨特的玩法體驗。她的起始遺物 黑貓&#xff08;Bl…

AI開發學習路線(闖關升級版)

以下是一份輕松版AI開發學習路線&#xff0c;用「闖關升級」的方式幫你從零開始變身AI開發者&#xff0c;每個階段都配有有趣的任務和實用資源&#xff0c;保證不枯燥、可落地&#xff01;&#x1f447; 目錄 &#x1f530; 新手村&#xff1a;打基礎&#xff08;1-2個月&…

迭代器模式深度解析與實戰案例

一、模式定義 迭代器模式&#xff08;Iterator Pattern&#xff09; 是一種行為設計模式&#xff0c;提供一種方法順序訪問聚合對象的元素&#xff0c;無需暴露其底層表示。核心思想是將遍歷邏輯從聚合對象中分離&#xff0c;實現 遍歷與存儲的解耦。 二、核心組件 組件作用…

SSH遠程工具

一、常見SSH遠程工具 工具開源跨平臺多標簽文件傳輸高級功能價格Xshell?Win????腳本、會話管理免費/商業版Tabby??全平臺????插件擴展免費MobaXterm?Win????集成工具集免費/付費SecureCRT?Win/macOS/Linux????企業級加密$129+PuTTY??全平臺??基礎連接…

VUE中的路由處理

1.引入,預處理main.ts import {} from vue-router import { createRouter, createWebHistory } from vue-router import HomePages from @/pages/HomePages.vue import AboutPage from @/pages/AboutPage.vue import NewsPage from @/pages/NewsPage.vue //1. 配置路由規…