c++:線程(std::thread)

目錄

從第一性原理出發:為什么需要線程?

?? 本質定義:

📌 使用基本語法:??

線程之間的“并發”與“并行”的區別

?線程安全與數據競爭(Race Condition)

如何讓線程“安全地”訪問數據??

完整示例:使用線程加速加法?


從第一性原理出發:為什么需要線程?

想象一下:

你有一個程序,它要做很多事,比如:

  • 下載文件

  • 處理圖片

  • 打印日志

  • 響應用戶輸入如果這些任務按順序來(單線程),那用戶體驗就會很差:比如下載還沒完,界面就卡住了。

第一性問題來了:?

能不能讓程序同時做多件事,而不是排隊一個個來??

?能!用線程!?

?? 本質定義:

?線程(Thread)是程序內部能并發執行的最小單位。

線程 = 程序里可以獨立并發執行的一段任務。?

一個程序至少有一個線程(主線程),你可以再創建多個線程來同時執行不同的代碼塊。

📌 使用基本語法:??

#include <thread>

?std::thread 類就是 C++ 提供的“創建和管理線程”的工具。

#include <iostream>
#include <thread>void work() {std::cout << "工作線程正在運行\n";
}int main() {std::thread t(work);  // 創建一個線程執行 work()t.join();             // 等待這個線程執行完std::cout << "主線程結束\n";
}

解釋:

  • std::thread t(work);:創建了一個“工人線程”,去執行函數 work

  • t.join();:告訴主線程“等工人做完再走”

  • 最后主線程輸出“主線程結束”

創建線程的三種方式:

方法示例
傳函數名(函數指針)std::thread t(func);
傳 lambda 表達式std::thread t([](){ ... });
傳函數對象(仿函數)std::thread t(Functor());

?線程的控制操作(joindetach

std::thread t(func);

你創建了一個新線程,但它和主線程是“并行運行的”。

?接下來你必須做一件事(二選一):

操作說明
t.join()等待這個線程運行結束,和主線程“合并”
t.detach()把線程“放飛”,讓它自己跑,主線程不再管它(后臺線程)

C++ 標準要求:每個 std::thread 對象 在銷毀前必須被 join 或 detach!?

注意:主線程可能在子線程還沒結束時就退出了,這種線程叫做 后臺線程。?

線程之間的“并發”與“并行”的區別

概念含義
并發(concurrent)邏輯上“同時”運行,實際上輪流交替執行(單核CPU)
并行(parallel)真正的同時執行(多核CPU,每個線程跑在不同核上)

?線程安全與數據競爭(Race Condition)

多個線程訪問同一塊數據會出問題!?

int counter = 0;void add() {for (int i = 0; i < 100000; ++i)++counter;
}int main() {std::thread t1(add);std::thread t2(add);t1.join();t2.join();std::cout << counter << std::endl;  // ? 輸出不是 200000?!
}

為什么?

  • 因為兩個線程在同時修改同一個變量

  • 出現了所謂的 數據競爭(Race Condition)

如何讓線程“安全地”訪問數據??

使用互斥鎖(std::mutex)?

#include <mutex>std::mutex mtx;void add() {for (int i = 0; i < 100000; ++i) {std::lock_guard<std::mutex> lock(mtx);  // 自動加鎖/解鎖++counter;}
}

?使用 lock_guard 是現代 C++ 推薦的做法,RAII 自動釋放鎖

完整示例:使用線程加速加法?

#include <iostream>
#include <thread>void printRange(int start, int end) {for (int i = start; i <= end; ++i)std::cout << i << " ";
}int main() {std::thread t1(printRange, 1, 50);std::thread t2(printRange, 51, 100);t1.join();t2.join();std::cout << "\nDone\n";
}

?輸出可能是:

1 2 3 51 52 53 ... 50 100

順序是“亂的”!因為是并發執行的結果。?

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

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

相關文章

PCL軟件架構

Point Cloud Library (PCL) 采用模塊化設計,提供了豐富的點云處理功能。以下是PCL的核心架構和主要類的詳細介紹。 一、PCL整體架構 PCL的架構可以分為以下幾個主要層次: 數據表示層:基礎點云數據結構和基本操作 算法層:各種點云處理算法實現 I/O層:點云數據的輸入輸出 …

CCLinkIE轉EtherCAT邊緣計算網關構建智能產線:跨協議設備動態組網與數據優化傳輸

一、行業背景 隨著新能源汽車市場爆發式增長&#xff0c;汽車制造企業對產線效率、設備協同性及柔性生產能力的要求顯著提升。傳統產線多采用CC-LinkIEFieldBasic&#xff08;CCLINKIEFB&#xff09;協議的三菱PLC控制系統&#xff0c;而新一代伺服驅動設備普遍采用EtherCAT協…

模態雙俠闖江湖:SimTier 分層破局,MAKE 智煉新知

目錄 利用多模態表示提升淘寶展示廣告效果&#xff1a;挑戰、方法與洞察摘要1 引言2 預備知識推薦模型中的ID特征基于ID的模型結構 3 多模態表示的預訓練3.1 語義感知對比學習3.2 預訓練數據集的構建3.3 優化 4 與推薦模型的集成4.1 觀察和見解4.2 方法一&#xff1a;SimTier4.…

基于大模型的下肢靜脈曲張全流程預測與診療方案研究報告

目錄 一、引言 1.1 研究背景與意義 1.2 研究目的與創新點 1.3 研究方法與數據來源 二、下肢靜脈曲張概述 2.1 定義與病理生理 2.2 風險因素與臨床表現 2.3 診斷方法與現有治療手段 三、大模型預測原理與構建 3.1 大模型技術簡介 3.2 預測模型的數據收集與預處理 3.…

跨站腳本(XSS) 的詳細分類、對比及解決方案

以下是 跨站腳本&#xff08;XSS&#xff09; 的詳細分類、對比及解決方案&#xff1a; 一、XSS的分類與詳解 1. 反射型XSS&#xff08;非持久型XSS&#xff09; 定義&#xff1a;攻擊載荷通過URL參數傳遞&#xff0c;服務器直接返回到頁面中&#xff0c;需用戶主動觸發。 工…

thinkphp實現圖像驗證碼

示例 服務類 app\common\lib\captcha <?php namespace app\common\lib\captcha;use think\facade\Cache; use think\facade\Config; use Exception;class Captcha {private $im null; // 驗證碼圖片實例private $color null; // 驗證碼字體顏色// 默認配置protected $co…

swift-12-Error處理、關聯類型、assert、泛型_

一、錯誤類型 開發過程常見的錯誤 語法錯誤&#xff08;編譯報錯&#xff09; 邏輯錯誤 運行時錯誤&#xff08;可能會導致閃退&#xff0c;一般也叫做異常&#xff09; 2.1 通過結構體 第一步 struct MyError : Errort { var msg: String &#xff5d; 第二步 func divide(_ …

實驗擴充 LED顯示4*4鍵位值

代碼功能概述 鍵盤掃描&#xff1a; 使用 KeyPort&#xff08;定義為 P1&#xff09;作為鍵盤輸入端口。掃描 4x4 矩陣鍵盤&#xff0c;檢測按鍵并返回按鍵編號&#xff08;0~15&#xff09;。 數碼管顯示&#xff1a; 根據按鍵編號&#xff0c;從 SegCode 數組中獲取對應數碼…

從零開始搭建CLIP模型實現基于文本的圖像檢索

目錄 CLIP原理簡介代碼實現參考鏈接 CLIP原理簡介 論文鏈接&#xff0c;源碼鏈接 CLIP模型由OpenAI在2021年提出&#xff0c;利用雙Decoder&#xff08;Dual Encoder&#xff09;的架構來學習圖像和文本之間的對應關系&#xff0c;是多模態大模型的開創之作&#xff0c;為后續許…

熊海cms代碼審計

目錄 sql注入 1. admin/files/login.php 2. admin/files/columnlist.php 3. admin/files/editcolumn.php 4. admin/files/editlink.php 5. admin/files/editsoft.php 6. admin/files/editwz.php 7. admin/files/linklist.php 8. files/software.php 9. files…

[Java微服務組件]注冊中心P3-Nacos中的設計模式1-觀察者模式

在P1-簡單注冊中心實現和P2-Nacos解析中&#xff0c;我們分別實現了簡單的注冊中心并總結了Nacos的一些設計。 本篇繼續看Nacos源碼&#xff0c;了解一下Nacos中的設計模式。 目錄 Nacos 觀察者模式 Observer Pattern觀察者模式總結 Nacos 觀察者模式 Observer Pattern 模式定…

電腦 訪問 github提示 找不到網頁,處理方案

1、找到 本機的 host文件 例如 windows 的 一般在 C:\Windows\System32\drivers\etc\hosts 用管理員身份打開 hosts 文件 如果文件中沒有 github的配置&#xff0c;需要自己手動添加上去&#xff1b; 如果有&#xff0c;則需要 檢查 github.com 與 github.global.ssl.fastly.…

Linux系統中的網絡管理

1.RHEL9版本中&#xff0c;使用nm進行網絡配置&#xff0c;ifcfg不再是網絡配置文件的主存儲&#xff0c;樣式仍然可用&#xff0c;但它不再是NetworkManger存儲新網絡配置文件的默認位置&#xff0c;RHEL以key-file格式在etc/NetworkManger/system-connections/中存儲新的網絡…

AI技術深度解析:從移動芯片到AIoT的全面突破

作為全球無線通信技術和半導體解決方案的重要參與者,高通始終將技術創新作為核心驅動力,在移動通信、物聯網(IoT)、汽車電子、AI計算等領域占據關鍵地位。本文將從其核心產品線、技術突破、應用場景及未來布局四個維度,客觀解析高通的技術積累與行業角色。 一、核心產品線…

使用CS Roofline Toolkit測量帶寬

使用CS Roofline Toolkit測量帶寬 工程下載&#xff1a;使用CS Roofline Toolkit測量帶寬-案例工程文件&#xff0c;也可以按照下面的說明使用git clone下載 目錄 使用CS Roofline Toolkit測量帶寬0、Roofline模型理解1、CS Roofline Toolkit下載1.1、設置代理1.2、git clone下…

EAGLE代碼研讀+模型復現

要對代碼下手了&#xff0c;加油(? ?_?)? 作者在他們自己的設備上展現了推理的評估結果&#xff0c;受第三方評估認證&#xff0c;EAGLE為目前最快的投機方法&#xff08;雖然加速度是評估投機解碼方法的主要指標&#xff0c;但其他點也值得關注。比如PLD和Lookahead無需額…

基于SFC的windows修復程序,修復絕大部分系統損壞

效果:可以自動修復大部分由系統文件損壞而導致的錯誤 例如:系統應用無法打開 系統窗口(例如開始菜單)無法使用 電腦藍屏或者卡死.....文章 01技術背景 Windows自帶了一個SFC命令行應用程序,可以檢查大部分的系統文件錯誤,以及復這些文件 其中自動檢查所有系統文件&#x…

liunx日志問題

一、日志定向 Linux 系統的日志配置文件&#xff08;如/etc/syslog.conf或/etc/rsyslog.conf &#xff09;中&#xff0c;用于定義系統日志的記錄規則&#xff0c;決定哪些類型的日志消息會被記錄到特定的日志文件中。 *.info;mail.none;authpriv.none;cron.none /va…

2.凸包優化求解

1.減而治之(Decrease and Conquer) 插入排序 典型的減而治之算法就是插入排序方法 插入排序法: 在未排序中選擇一個元素&#xff0c;插入到已經排序號的序列中 將凸包也采用減而治之的方法 2.In-Convex-Polygon Test 怎么判斷引入的極點存在于多邊形里面還是外面&#xff1…

系統思考:危機中的轉型機遇

“危機不僅是挑戰&#xff0c;更是轉型的機會” 每當大事發生&#xff0c;很多企業老板常常被眼前的困境壓得喘不過氣&#xff0c;焦慮與壓力讓人難以思考長遠。特別是在危機面前&#xff0c;大家忙于應對眼前的風險&#xff0c;卻忽略了背后隱藏的機遇。而危機&#xff0c;恰…