C++多線程常用方法

在 C++ 中,線程相關功能主要通過頭文件提供的類和函數來實現,以下是一些常用的線程接口方法和使用技巧:

std::thread類

構造函數:
可以通過傳入可調用對象(如函數指針、函數對象、lambda 表達式等)來創建一個線程實例,啟動一個新線程去執行對應的任務。例如:

#include <iostream>
#include <thread>void hello() {std::cout << "Hello from thread!" << std::endl;
}int main() {std::thread t(hello);  // 創建線程t并開始執行hello函數t.join();  // 等待線程t執行完畢return 0;
}

這里std::thread t(hello)就是利用函數指針hello創建線程,新線程會執行hello函數里的代碼。

join方法:
用于阻塞當前線程,直到被調用的線程執行完成。比如在上面的main函數中,t.join()會讓main線程暫停,等待t線程把hello函數執行完后再繼續往下執行。
detach方法
將線程分離,使得線程在后臺獨立運行,不再與創建它的std::thread對象關聯。此后,無法再通過該std::thread對象對這個線程進行控制(比如不能再調用join了)。示例:

#include <iostream>
#include <thread>void func() {// 線程執行的函數內容std::cout << "Thread is running independently." << std::endl;
}int main() {std::thread t(func);t.detach();  // 分離線程t// 主線程繼續執行其他操作,不用等待t線程結束std::cout << "Main thread continues." << std::endl;return 0;
}

線程傳參
向線程函數傳遞參數時,需要保證參數在傳遞時是有效的,且在被調用函數執行期間持續有效(比如避免傳引用指向臨時對象等情況)。例如:

#include <iostream>
#include <thread>void print_num(int num) {std::cout << "The number is: " << num << std::endl;
}int main() {int num = 10;std::thread t(print_num, num);  // 傳遞普通變量num作為參數t.join();return 0;
}

如果要傳遞類對象等更復雜的情況,要注意拷貝、移動語義等相關問題,確保參數傳遞的正確性。
線程 ID 獲取
可以通過std::this_thread::get_id獲取當前線程的線程 ID,或者通過std::thread對象的get_id成員函數獲取對應的線程 ID,用于標識和區分不同線程。示例:

#include <iostream>
#include <thread>void show_thread_id() {std::cout << "Thread ID: " << std::this_thread::get_id() << std::endl;
}int main() {std::thread t(show_thread_id);std::cout << "Main thread ID: " << std::this_thread::get_id() << std::endl;t.join();return 0;
}

線程同步相關(例如互斥量等,用于解決多線程訪問共享資源沖突問題)

std::mutex(互斥量):
通過lock和unlock方法對共享資源進行加鎖和解鎖,確保同一時刻只有一個線程能訪問被保護的共享資源。例如:

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;
int shared_data = 0;void increment() {for (int i = 0; i < 1000; ++i) {mtx.lock();  // 加鎖shared_data++;mtx.unlock();  // 解鎖}
}int main() {std::thread t1(increment);std::thread t2(increment);t1.join();t2.join();std::cout << "Shared data value: " << shared_data << std::endl;return 0;
}

也可以使用std::lock_guard等 RAII(Resource Acquisition Is Initialization)機制的類來更方便、安全地管理互斥量的生命周期,自動完成加鎖和解鎖,如:

#include <iostream>
#include <thread>
#include <mutex>std::mutex mtx;
int shared_data = 0;void increment() {for (int i = 0; i < 1000; ++i) {std::lock_guard<std::mutex> guard(mtx);  // 構造時加鎖,析構時自動解鎖shared_data++;}
}int main() {std::thread t1(increment);std::thread t2(increment);t1.join();t2.join();std::cout << "Shared data value: " << shared_data << std::endl;return 0;
}

std::condition_variable(條件變量):
常和互斥量配合使用,用于線程間的同步,實現一個線程等待某個條件滿足后再繼續執行的功能。比如一個線程等待另一個線程修改共享資源達到某個條件后再進行后續操作,典型用法如下:

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void wait_for_signal() {std::unique_lock<std::mutex> lck(mtx);cv.wait(lck, []{ return ready; });  // 等待條件滿足(ready為true)std::cout << "Received signal and continue." << std::endl;
}void send_signal() {{std::lock_guard<std::mutex> lck(mtx);ready = true;}cv.notify_one();  // 通知等待在該條件變量上的一個線程
}int main() {std::thread t1(wait_for_signal);std::thread t2(send_signal);t1.join();t2.join();return 0;
}

這些就是 C++ 中線程相關的一些主要接口方法及其基本使用方式,在實際多線程編程中,往往需要綜合運用它們來實現高效、正確的并發程序邏輯。

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

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

相關文章

up主親測,ToDesk/青椒云/順網云這三款云電腦玩轉AIGC場景

文章目錄 1. 前言2. 云電腦性能分析3. 基礎硬件數據3.1 硬件配置3.2 AI 評測跑分 4. 云電腦 AIGC 上手實測4.1 ToDesk4.1.1 AIGC 技術集成情況4.1.2 界面及功能4.1.3 項目部署4.1.4 黑神話悟空 AI 換臉4.1.6 AIGC 文生圖體驗 4.2 青椒云4.2.1 AIGC 技術集成情況4.2.2 界面及功能…

C++(十八)

前言&#xff1a; 本文依據上一篇&#xff0c;繼續對C中的函數進行學習。 一&#xff0c;內聯函數。 再執行函數代碼時&#xff0c;比不使用函數花費了更多時間&#xff0c;因為總結步驟&#xff0c;傳遞參數和返回值都很花費時間。 因此&#xff0c;在調試小型函數時&…

功能篇:JAVA后端實現跨域配置

在Java后端實現跨域配置&#xff08;CORS&#xff0c;Cross-Origin Resource Sharing&#xff09;有多種方法&#xff0c;具體取決于你使用的框架。如果你使用的是Spring Boot或Spring MVC&#xff0c;可以通過以下幾種方式來配置CORS。 ### 方法一&#xff1a;全局配置 對于所…

數獨游戲app制作拆解(之一)——功能介紹

android studio版本&#xff1a;2023.3.1 例程名稱&#xff1a;shudu666 前陣子作了一個EXCEL版的數獨&#xff0c;再早之前就想作這個數獨app,但一直沒動手&#xff0c;一方面懶&#xff0c;另一方面我把自己繞到坑里了&#xff0c;之前做的是一解數獨的app,那個是有點難&am…

Spring注解篇:@Configuration詳解

前言 在Spring框架中&#xff0c;Configuration注解是實現Java配置的核心。它允許開發者以編程的方式定義Bean的創建過程&#xff0c;而不是使用XML文件。這種基于注解的配置方式&#xff0c;不僅簡化了配置的復雜性&#xff0c;還提高了代碼的可讀性和可維護性。 摘要 本文…

通過一個例子學習回溯算法:從方法論到實際應用

回溯算法&#xff1a;從方法論到實際應用 回溯算法&#xff08;Backtracking&#xff09;是一種通過窮舉法尋找問題所有解的算法&#xff0c;它的核心思想是逐步構建解空間樹&#xff0c;在每個步驟中判斷當前解是否合法。如果不合法&#xff0c;就“回溯”到上一步&#xff0…

Python隨機抽取Excel數據并在處理后整合為一個文件

本文介紹基于Python語言&#xff0c;針對一個文件夾下大量的Excel表格文件&#xff0c;基于其中每一個文件&#xff0c;隨機從其中選取一部分數據&#xff0c;并將全部文件中隨機獲取的數據合并為一個新的Excel表格文件的方法。 首先&#xff0c;我們來明確一下本文的具體需求。…

構建樹莓派溫濕度監測系統:從硬件到軟件的完整指南

?作者簡介&#xff1a;2022年博客新星 第八。熱愛國學的Java后端開發者&#xff0c;修心和技術同步精進。 &#x1f34e;個人主頁&#xff1a;Java Fans的博客 &#x1f34a;個人信條&#xff1a;不遷怒&#xff0c;不貳過。小知識&#xff0c;大智慧。 &#x1f49e;當前專欄…

28. Three.js案例-創建圓角矩形并進行拉伸

28. Three.js案例-創建圓角矩形并進行拉伸 實現效果 知識點 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染 3D 場景的主要渲染器。 構造器 WebGLRenderer( parameters : Object ) 參數類型描述parametersObject渲染器的配置參數&#xff0c;可選。 …

開源Java快速自測工具,可以調用系統內任意一個方法

java快速測試框架&#xff0c;可以調到系統內任意一個方法&#xff0c;告別寫單測和controller的困擾。 開源地址&#xff1a;https://gitee.com/missyouch/Easy-JTest 我們在開發時很多時候想要測試下自己的代碼&#xff0c;特別是service層或者是更底層的代碼&#xff0c;就…

004 QT常用控件Qwidget_上

文章目錄 前言控件概述QWidgetenable屬性geometry屬性windowTitle屬性windowlcon屬性 小結 前言 本文將會向你介紹常用的Qwidget屬性 控件概述 Widget 是 Qt 中的核心概念. 英文原義是 “?部件”, 我們此處把它翻譯為 “控件” . 控件是構成?個圖形化界面的基本要素. QWi…

Android 好的開源庫

1. 權限請求框架 GitHub - getActivity/XXPermissions: Android 權限請求框架&#xff0c;已適配 Android 14 2. 下載框架 GitHub - lingochamp/okdownload: A Reliable, Flexible, Fast and Powerful download engine.

Flash語音芯片相比OTP語音芯片的優勢

Flash語音芯片和OTP語音芯片是兩種常見的語音解決方案&#xff0c;在各自的應用領域中發揮著重要作用。本文?將介紹Flash語音芯片相比OTP(One-Time Programmable)語音芯片的顯著優勢?。 1?.可重復擦寫?&#xff1a;Flash語音芯片的最大特點是支持多次編程和擦除&#xff0c…

Android命令行工具--dumpsys

dumpsys 是一種在 Android 設備上運行的工具&#xff0c;可提供有關系統服務的信息。可以使用 Android 調試橋 (adb) 從命令行調用 dumpsys&#xff0c;獲取在連接的設備上運行的所有系統服務的診斷輸出。 此輸出通常比您想要的更詳細&#xff0c;因此請使用此頁面上的命令行選…

【深度學習】深刻理解Swin Transformer

Swin Transformer 是一種基于 Transformer 的視覺模型&#xff0c;由 Microsoft 研究團隊提出&#xff0c;旨在解決傳統 Transformer 模型在計算機視覺任務中的高計算復雜度問題。其全稱是 Shifted Window Transformer&#xff0c;通過引入分層架構和滑動窗口機制&#xff0c;S…

從零開始學習 sg200x 多核開發之 sophpi 編譯生成 fip.bin 流程梳理

本文主要介紹 sophpi 編譯生成 fip.bin 流程。 1、編譯前準備 sophpi 的基本編譯流程如下&#xff1a; $ source build/cvisetup.sh $ defconfig sg2002_wevb_riscv64_sd $ clean_all $ build_all $ pack_burn_image注&#xff1a; 需要在 bash 下運行clean_all 非必要可以不…

mysql客戶端命令

目錄 結束符 ; \g \G 中斷輸入 ctrl c 查看命令列表 help ? (\?) connect (\r) status (\s) delimiter (\d) exit (\q) quit (\q) tee (\T) ?編輯 notee (\t) prompt (\R) source (\.) system (\!) ?編輯 use (\u) help contents 結束符 ; \g \G 當我…

scala隱式函數

1 定義 通常我們所說的隱式函數也稱為 隱式轉換&#xff0c;是使用 implicit 修飾的函數 作用&#xff1a; 可以通過一個隱式函數將一種類型轉變為另一種類型 隱式轉換有兩種應用場景&#xff1a; 類型轉換&#xff0c;隱式轉換為期望類型 類型增強 2 示例 ①&#xff1a;類…

Tomcat原理(4)——嘗試手動Servlet的實現

目錄 一、什么是Servlet 1.servlet的定義 2.servlet的結構 二、實現servlet的流程圖 三、具體實現代碼 1、server 2.實體類request&response 3.HttpServlet抽象類 4.再定義三個servlet進行測試 Tomcat原理&#xff08;3&#xff09;——靜&動態資源以及運行項…

Node.js內置模塊

1.內置模塊 Node.js的中文網參考手冊:https://nodejs.cn//api 幫助文檔 API文檔:查看對應的模塊,左邊是模塊,右邊是模塊的成員 源碼:https://github.com/nodejs/node/tree/main/lib 查看 例如: http.js 創建web服務器的模塊 -->進入源碼中,搜索…