《C++11》并發庫:簡介與應用

生成卡通圖片.png

在C++11之前,C++并沒有提供原生的并發支持。開發者通常需要依賴于操作系統的API(如Windows的CreateThread或POSIX的pthread_create)或者第三方庫(如Boost.Thread)來創建和管理線程。這些方式存在以下幾個問題:

  1. 平臺依賴:不同的操作系統提供了不同的線程API,這意味著你需要為每個目標平臺編寫不同的代碼,或者使用預處理器宏來處理平臺差異。這會使代碼變得復雜和難以維護。

  2. 錯誤處理困難:操作系統的線程API通常通過返回錯誤碼來報告錯誤,這需要你在每次調用API后檢查錯誤碼,并手動處理錯誤。這不僅繁瑣,而且容易出錯。

  3. 缺乏高級特性:操作系統的線程API通常只提供了基礎的線程創建和同步功能,缺乏一些高級特性,如線程池、future和promise等。

相比之下,C++11的并發庫提供了以下優勢:

  1. 平臺無關:C++11的并發庫是C++標準的一部分,這意味著你可以在任何支持C++11的編譯器上使用它,無需考慮平臺差異。

  2. 異常安全:C++11的并發庫使用異常來報告錯誤,這使得錯誤處理更加簡單和安全。例如,如果你試圖在已經啟動的線程上調用std::thread::join,C++11會拋出一個std::system_error異常。

  3. 高級特性:C++11的并發庫提供了一些高級特性,如std::asyncstd::futurestd::promise等,這些特性使得并發編程更加方便和強大。

這些工具使得C++程序員可以更方便、更安全地編寫多線程代碼。下面我們將詳細介紹這些并發工具的使用。

1. 線程(std::thread)

C++11的std::thread類提供了對操作系統原生線程的封裝。你可以通過創建std::thread對象來創建新的線程,并通過成員函數join()detach()來等待線程結束或讓線程在后臺運行。

#include <iostream>
#include <thread>void hello() {std::cout << "Hello, concurrent world\n";
}int main() {std::thread t(hello);t.join();
}

在這個例子中,我們創建了一個新的線程來運行hello函數,并在主線程中通過join()等待新線程結束。

2. 互斥量(std::mutex)

C++11的std::mutex類提供了對操作系統原生互斥量的封裝。你可以使用互斥量來保護共享數據,防止多個線程同時訪問。

#include <mutex>
#include <thread>std::mutex mtx;  // 全局互斥量void print_block(int n, char c) {mtx.lock();for (int i=0; i<n; ++i) { std::cout << c; }std::cout << '\n';mtx.unlock();
}int main() {std::thread th1(print_block,50,'*');std::thread th2(print_block,50,'$');th1.join();th2.join();return 0;
}

在這個例子中,我們使用互斥量mtx來保護std::cout,防止兩個線程同時輸出。

3. 條件變量(std::condition_variable)

C++11的std::condition_variable類提供了對操作系統原生條件變量的封裝。你可以使用條件變量來實現線程間的同步。

#include <iostream>
#include <thread>
#include <mutex>
#include <condition_variable>std::mutex mtx;
std::condition_variable cv;
bool ready = false;void print_id(int id) {std::unique_lock<std::mutex> lck(mtx);while (!ready) cv.wait(lck);std::cout << "thread " << id << '\n';
}void go() {std::unique_lock<std::mutex> lck(mtx);ready = true;cv.notify_all();
}int main() {std::thread threads[10];for (int i=0; i<10; ++i)threads[i] = std::thread(print_id,i);std::cout << "10 threads ready to race...\n";go();for (auto& th : threads) th.join();return 0;
}

在這個例子中,我們使用條件變量cv來實現10個線程的同步。當go函數被調用時,所有等待在cv上的線程都會被喚醒。

4. Future(std::future)

C++11的std::future類提供了一種表示異步操作結果的方式。你可以使用std::async函數來啟動一個異步操作,并返回一個std::future對象。然后你可以在任何時候通過std::future::get函數來獲取異步操作的結果。

#include <iostream>
#include <future>int factorial(int n) {int res = 1;for(int i = n; i > 1; --i)res *= i;return res;
}int main() {std::future<int> fut = std::async(factorial, 5);std::cout << "Factorial of 5 is " << fut.get() << std::endl;return 0;
}

在這個例子中,我們使用std::async啟動了一個異步操作來計算5的階乘,并通過std::future::get獲取了結果。

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

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

相關文章

【記錄52】el-table-column 添加fixed屬性 滾動條無法滑動

問題&#xff1a; el-table-column 添加fixed屬性 滾動條無法滑動 使用element UI組件&#xff0c;用到el-table的el-table-column的fixed屬性時&#xff0c;當滾動條長度小于固定列時&#xff0c;滾動條無法通過鼠標去點擊滑動操作 原因 fixed是用來固定列的屬性&#xff0c;其…

rtthread學習筆記系列-- 22 dataqueue

文章目錄 22 dataqueue https://github.com/wdfk-prog/RT-Thread-Study 22 dataqueue 消息隊列&#xff1a;消息隊列能夠接收來自線程或中斷服務例程中不固定長度的消息&#xff0c;并把消息緩存在自己的內存空間中。其他線程也能夠從消息隊列中讀取相應的消息&#xff0c;而當…

了解Node.js

Node.js是一個基于V8引擎的JavaScript運行時環境&#xff0c;它允許JavaScript代碼在服務器端運行&#xff0c;從而實現后端開發。Node.js的出現&#xff0c;使得前端開發人員可以利用他們已經掌握的JavaScript技能&#xff0c;擴展技能樹并成為全棧開發人員。本文將深入淺出地…

微信小程序在使用頁面棧保存頁面信息時,如何避免數據丟失?

微信小程序在使用頁面棧保存頁面信息時避免數據丟失的方法&#xff1a; 一、使用全局變量存儲關鍵數據&#xff1a; 定義一個全局變量&#xff0c;例如在 app.js 中&#xff0c;用于存儲頁面的重要信息。在頁面的 onHide 或 onUnload 生命周期中&#xff0c;將需要保存的數據…

文件上傳 分片上傳

分片上傳則是將一個大文件分割成多個小塊分別上傳&#xff0c;最后再由服務器合并成完整的文件。這種做法的好處是可以并行處理多個小文件&#xff0c;提高上傳效率&#xff1b;同時&#xff0c;如果某一部分上傳失敗&#xff0c;只需要重傳這一部分&#xff0c;不影響其他部分…

js解決 Number失精度問題

const updatePromises adinfo.rows.map(async item > {const cwf await uniCloud.httpclient.request("https://api.oceanengine.com/open_api/v3.0/project/list/", {method: GET,data: {advertiser_id: item.account_id},// 1. 指定text數據格式dataType: tex…

實力認證 | 海云安入選《信創安全產品及服務購買決策參考》

近日&#xff0c;國內知名安全調研機構GoUpSec發布了2024年中國網絡安全行業《信創安全產品及服務購買決策參考》&#xff0c;報告從產品特點、產品優勢、成功案例、安全策略等維度對各廠商信創安全產品及服務進行調研了解。 海云安憑借AI大模型技術在信創安全領域中的創新應用…

Picocli 命令行框架

官方文檔 https://picocli.info/ 官方提供的快速入門教程 https://picocli.info/quick-guide.html 使用 Picocli 創建命令行應用程序 Picocli 是一個用于構建 Java 命令行應用的強大框架&#xff0c;它簡化了參數解析和幫助消息生成的過程。 下面是如何使用 Picocli 構建簡單命…

windows系統“GameInputRedist.dll”文件丟失或錯誤導致游戲運行異常如何解決?windows系統DLL文件修復方法

GameInputRedist.dll是存放在windows系統中的一個重要dll文件&#xff0c;缺少它可能會造成部分游戲不能正常運行。當你的電腦彈出提示“無法找到GameInputRedist.dll”或“計算機缺少GameInputRedist.dll”等錯誤問題&#xff0c;請不用擔心&#xff0c;我們將深入解析DLL文件…

M4Pro安裝homebrew并基于homebrew安裝MySQL踩坑記錄

系統偏好設置允許安裝任何來源應用&#xff1a;sudo spctl --master-disable 清除提示已損壞軟件的安全隔離&#xff0c;重新安裝&#xff1a; xattr -cr 空格&#xff0b;App路徑 安裝homebrew&#xff1a; /opt/homebrew/Cellar 安裝包目錄 /opt/homebrew/etc 默認運行目…

tmux 中鼠標滾動異常:^[[A和^[[B是什么以及如何解決

tmux 中鼠標滾動異常問題及解決方案 在使用 tmux 時&#xff0c;有時我們會遇到一個現象&#xff1a;當嘗試使用鼠標滾輪滾動窗口內容時&#xff0c;終端中會出現一串類似 ^[[A^[[A 的字符。這讓人困惑&#xff0c;不知道鼠標滾動為什么不起作用&#xff0c;也不清楚這些字符究…

【Vue】mouted、created、computed區別

mouted、created、computed區別 前端vue重構 — computed、watch、組件通信等常用知識整理 created和mouted都是vue生命周期中的鉤子函數&#xff0c;通常用來做一些初始化的工作&#xff0c;比如發送http請求、對組件綁定自定義事件 created&#xff1a;實例創建完后立即調用…

前端如何設計一個回溯用戶操作的方案

同一個項目&#xff0c;為什么我本地無法復現&#xff0c;只有客戶的設備才復現&#xff1f; 如何獲取用戶的操作路徑呢&#xff1f; 兩種方案&#xff1a;埋點和rrweb 埋點就很簡單了&#xff0c;將所有可能操作的節點都進行預埋數據&#xff1b;但埋點簡單并不省心&#xff…

概率論考前一天

判斷是不是分布函數&#xff1a;單調不減&#xff0c;右連續&#xff0c;F負無窮為0&#xff0c; F正無窮為1 判斷是不是密度函數&#xff1a;非負性&#xff08;函數任意地方都大于0&#xff09;&#xff0c;規范&#xff1a;積分為1

2Hive表類型

2Hive表類型 1 Hive 數據類型2 Hive 內部表3 Hive 外部表4 Hive 分區表5 Hive 分桶表6 Hive 視圖 1 Hive 數據類型 Hive的基本數據類型有&#xff1a;TINYINT&#xff0c;SAMLLINT&#xff0c;INT&#xff0c;BIGINT&#xff0c;BOOLEAN&#xff0c;FLOAT&#xff0c;DOUBLE&a…

FPGA工程師成長四階段

朋友&#xff0c;你有入行三年、五年、十年的職業規劃嗎&#xff1f;你知道你所做的崗位未來該如何成長嗎&#xff1f; FPGA行業的發展近幾年是蓬勃發展&#xff0c;有越來越多的人才想要或已經踏進了FPGA行業的大門。很多同學在入行FPGA之前&#xff0c;都會抱著滿腹對職業發…

springCloudGateway+nacos自定義負載均衡-通過IP隔離開發環境

先說一下想法&#xff0c;小公司開發項目&#xff0c;參考若依框架使用的spring-cloud-starter-gateway和spring-cloud-starter-alibaba-nacos, 用到了nacos的配置中心和注冊中心&#xff0c;有多個模塊&#xff08;每個模塊都是一個服務&#xff09;。 想本地開發&#xff0c;…

深度解析 React 中 setState 的原理:同步與異步的交織

在 React 框架的核心機制里&#xff0c;setState是實現動態交互與數據驅動視圖更新的關鍵樞紐。深入理解setState的工作原理&#xff0c;尤其是其同步與異步的特性&#xff0c;對于編寫高效、穩定且可預測的 React 應用至關重要。 一、setState 的基礎認知 在 React 組件中&a…

向量數據庫如何助力Text2SQL處理高基數類別數據

01. 導語 Agent工作流和 LLMs &#xff08;大語言模型&#xff09;的出現&#xff0c;讓我們能夠以自然語言交互的模式執行復雜的SQL查詢&#xff0c;并徹底改變Text2SQL系統的運行方式。其典型代表是如何處理High-Cardinality Categorical Data &#xff08;高基數類別數據&am…

qBittorent訪問webui時提示unauthorized解決方法

現象描述 QNAP使用Container Station運行容器&#xff0c;使用Docker封裝qBittorrent時&#xff0c;訪問IP:PORT的方式后無法訪問到webui&#xff0c;而是提示unauthorized&#xff0c;如圖&#xff1a; 原因分析 此時通常是由于設備IP與qBittorrent的ip地址不在同一個網段導致…