C++ 多線程鎖

目錄

    • 1. mutex
    • 2. lock_guard
    • 3. unique_lock 是 lock_guard 的升級加強版
    • 4. condition_variable
    • 5. 調用

#include “thread”
#include “mutex”
#include “iostream”

//! std::thread
//! jion 阻塞式, .join()后面的代碼等待線程結束
//! detach 非阻塞式, 后面代碼繼續執行

1. mutex

類型說明
std::mutex最基本的 Mutex 類。
std::recursive_mutex遞歸 Mutex 類
std::time_mutex定時 Mutex 類
std::recursive_timed_mutex定時遞歸 Mutex 類。
std::mutex mtx;
int i = 0;
void add1()
{mtx.lock();for(int n = 0; n < 20; ++n)std::cout<<"add1 i = "<<++i<<std::endl;mtx.unlock();
}void add2()
{mtx.lock();for(int n = 0; n < 20; ++n)std::cout<<"add2 i = "<<++i<<std::endl;mtx.unlock();
}

2. lock_guard

//! 創建即加鎖,作用域結束自動析構并解鎖,無需手工解鎖
//! 不能中途解鎖,必須等作用域結束才解鎖
//! 不能復制

void add3()
{std::this_thread::sleep_for(std::chrono::milliseconds(10));std::lock_guard<std::mutex> lockg(mtx);for(int n = 0; n < 20; ++n){std::cout<<"add3 i = "<<++i<<std::endl;}
}void add4()
{std::this_thread::sleep_for(std::chrono::milliseconds(10));std::lock_guard<std::mutex> lockg(mtx);for(int n = 0; n < 20; ++n){std::cout<<"add4 i = "<<++i<<std::endl;}
}

3. unique_lock 是 lock_guard 的升級加強版

//! 創建時可以不鎖定(通過指定第二個參數為std::defer_lock),而在需要時再鎖定
//! 可以隨時加鎖解鎖
//! 作用域規則同 lock_grard,析構時自動釋放鎖
//! 不可復制,可移動
//! 條件變量需要該類型的鎖作為參數(此時必須使用unique_lock)
//! std::adopt_lock (必須先加鎖)
//! std::try_to_lock
//! std::defer_lock (必須手動加鎖)

void add5()
{//! std::adopt_lock//mtx.lock();//std::unique_lock<std::mutex> ulock(mtx, std::adopt_lock);// 先加鎖//! std::defer_lock//std::unique_lock<std::mutex> ulock(mtx, std::defer_lock);// 后手動加鎖//ulock.lock();//!std::unique_lock<std::mutex> ulock(mtx);	//自動加鎖for(int n = 0; n < 20; ++n)std::cout<<"add5 i = "<<++i<<std::endl;
}void add6()
{//! std::adopt_lock//mtx.lock();//std::unique_lock<std::mutex> ulock(mtx, std::adopt_lock);//! std::defer_lock//std::unique_lock<std::mutex> ulock(mtx, std::defer_lock);//ulock.lock();//!std::unique_lock<std::mutex> ulock(mtx);for(int n = 0; n < 20; ++n)std::cout<<"add6 i = "<<++i<<std::endl;
}

4. condition_variable

std::condition_variable cv;
bool wait = false;
void printf1(int n)
{for (int i = 0; i < n; ++i) {std::unique_lock<std::mutex> ulock(mtx);if(wait) cv.wait(ulock);std::cout<<"printf1    " << i <<std::endl;wait = true;cv.notify_one();}
}void printf2(int n)
{for (int i = 0; i < n; ++i) {std::unique_lock<std::mutex> ulock(mtx);if(!wait) cv.wait(ulock);std::cout<<"printf2    " << i+10 <<std::endl;wait = false;cv.notify_one();}
}

5. 調用

//! 1.mutexstd::thread td(add1);std::thread td2(add2);td.join();td2.join();
//! 2. lock_guardstd::thread td3(add3);std::thread td4(add4);td3.detach();td4.detach();
//! 3. unique_lock
std::thread td5(add5);
std::thread td6(add6);
td5.detach();
td6.detach();
//! 4. condition_variable + unique_lock
std::thread td7(printf1, 10);
std::thread td8(printf2, 10);
td7.detach();
td8.detach();

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

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

相關文章

一、TIDB基礎

TIDB整個邏輯架構跟MYSQL類似&#xff0c;如下&#xff1a; TIDB集群&#xff1a;相當于MYSQL的數據庫服務器&#xff0c;區別是MYSQL數據庫服務器為單進程的&#xff0c;TIDB集群為分布式多進程的。 數據庫&#xff1a;同MYSQL數據庫&#xff0c;數據庫屬于集群&#xff0c;…

SSL握手失敗的解決方案

一、SSL握手失敗的原因&#xff1a; 1&#xff0c;證書過期&#xff1a;SSL證書有一個有效期限&#xff0c;如果證書過期&#xff0c;就會導致SSL握手失敗。 2&#xff0c;證書不被信任&#xff1a;如果網站的SSL證書不被瀏覽器或操作系統信任&#xff0c;也會導致SSL握手失敗…

線性代數的藝術

推薦一本日本網友Kenji Hiranabe寫的《線性代數的藝術》。這本書是基于MIT大牛Gilbert Strang教授的《每個人的線性代數》制作的。 雖然《線性代數的藝術》這本書僅僅只有12頁的內容&#xff0c;就把線性代數的重點全畫完了&#xff0c;清晰明了。 《線性代數的藝術》PDF版本&…

mysql 變量和配置詳解

MySQL 中還有一些特殊的全局變量&#xff0c;如 log_bin、tmpdir、version、datadir&#xff0c;在 MySQL 服務實例運行期間它們的值不能動態修改&#xff0c;也就是不能使用 SET 命令進行重新設置&#xff0c;這種變量稱為靜態變量。數據庫管理員可以使用前面提到的修改源代碼…

nodejs 將word轉為pdf office-to-pdf

jspdf用于html轉pdf。需借助html2canvas遍歷頁面中的dom節點,渲染成canvas image&#xff0c;再用jspdf把圖片轉為pdf。office-to-pdf 用于word轉pdf。依賴于libreOffice&#xff0c;需提前安裝 mac安裝libreOffice 1.首先需要jdk8,并配置環境變量 2.再就是需要安裝libreOf…

【Golang】使用泛型對數組進行去重

背景&#xff1a; 要求寫一個方法&#xff0c;返回去重后的數組。數組的類型可能是int64&#xff0c;也可能是string&#xff0c;或是其他類型。 如果區分類型的話&#xff0c;每增加一個新的類型都需要重新寫一個方法。 示例代碼&#xff1a; //對int64數組進行去重 func DeD…

ErphpdownV16.21插件 安裝教程和插件下載

ErphpdownV16.21插件下載_新版本 上傳插件并解壓 登入后臺插件管理啟動ErphpdownV16.21插件即可 啟動后設置即可使用此版本為學習版插件 功能介紹&#xff1a; Erphpdown會員推廣下載專業版 經過完美測試運行于wordpress 3.x-6.x版本。后續會增加更多實用的功能。已針對此插件…

Vue中學習筆記-數據代理

文章目錄 前文提要數據代理的概念MVVM模型和Vue中的數據代理M&#xff0c;模型V&#xff0c;視圖VM&#xff0c;視圖模型 前文提要 本人僅做個人學習記錄&#xff0c;如有錯誤&#xff0c;請多包涵 數據代理的概念 使用一個對象代理對另一個對象中屬性的操作。 MVVM模型和Vu…

Windows IDEA Python開發環境安裝+爬蟲示例

文章目錄 Python下載安裝開發工具IDEA包管理安裝pip基本用法從 requirements.txt 安裝依賴 項目示例部署在 Linux 上安裝Python在 Linux 上創建虛擬環境&#xff1a;安裝依賴&#xff1a;運行你的爬蟲 Python下載安裝 Python 安裝包下載地址&#xff1a;https://www.python.or…

Oracle登錄認證方式詳解

文章目錄 一、簡介二、OS認證三、口令認證四、remote_login_passwordfile 詳解 一、簡介 在數據庫管理中&#xff0c;登錄認證是確保數據庫安全性的重要環節。Oracle數據庫提供 了兩種認證方式&#xff0c;一種是“操作系統認證”&#xff0c;一種是“口令文件認證&#xff0c…

智安網絡|如何最大限度地提高企業網絡安全水平

在當今數字化時代&#xff0c;企業面臨著日益復雜和智能化的網絡威脅。為了保護企業的機密信息和客戶數據&#xff0c;漏洞掃描成為了一個至關重要的安全措施。然而&#xff0c;對于企業來說&#xff0c;他們最關心的是什么問題呢&#xff1f; 一、漏洞的發現和修復 在網絡安全…

路徑規劃之Best-First Search算法

系列文章目錄 路徑規劃之Dijkstra算法 路徑規劃之Best-First Search算法 路徑規劃之Best-First Search算法 系列文章目錄前言一、Best-First Search算法1.1 起源1.2 過程 三、簡單使用 前言 Best-First Search算法和Dijkstra算法類似&#xff0c;都屬于BFS的擴展或改進 一、…

Nginx 服務器 SSL 證書安裝部署

操作場景 本文檔以證書名稱 menglinfeng.top 為例。 Nginx 版本以 nginx/1.18.0 為例。 當前服務器的操作系統為 CentOS 7&#xff0c;由于操作系統的版本不同&#xff0c;詳細操作步驟略有區別。 安裝 SSL 證書前&#xff0c;請您在 Nginx 服務器上開啟 “443” 端口&#xf…

基于官方YOLOv4開發構建目標檢測模型超詳細實戰教程【以自建缺陷檢測數據集為例】

本文是關于基于YOLOv4開發構建目標檢測模型的超詳細實戰教程&#xff0c;超詳細實戰教程相關的博文在前文有相應的系列&#xff0c;感興趣的話可以自行移步閱讀即可&#xff1a;《基于yolov7開發實踐實例分割模型超詳細教程》 《YOLOv7基于自己的數據集從零構建模型完整訓練、…

springboot(ssm超市貨品信息管理系統 超市購物系統Java(codeLW)

springboot(ssm超市貨品信息管理系統 超市購物系統Java(code&LW) 開發語言&#xff1a;Java 框架&#xff1a;ssm/springboot vue JDK版本&#xff1a;JDK1.8&#xff08;或11&#xff09; 服務器&#xff1a;tomcat 數據庫&#xff1a;mysql 5.7&#xff08;或8.0&am…

Linux技能篇-非交互式修改密碼

今天的文章沒有格式&#xff0c;簡單分享一個小技能&#xff0c;就是標題所說–非交互式修改密碼。 一、普通方式修改用戶密碼 最普通的修改密碼的命令就是passwd命令 [rootlocalhost ~]# passwd root Changing password for user root. New password: Retype new password:…

一文徹底看懂Python切片,Python切片理解與操作

1.什么是切片 切片是Python中一種用于操作序列類型(如列表、字符串和元組)的方法。它通過指定起始索引和結束索引來截取出序列的一部分,形成一個新的序列。切片是訪問特定范圍內的元素,就是一個Area。 說個笑話:切片不是切片,而是切片,但是又是切片。大家理解下呢(末…

高防cdn防護原理是什么,是否可以防護服務器嗎

隨著互聯網業務的迅速發展&#xff0c;網絡安全問題日益凸顯。在這樣的背景下&#xff0c;高防CDN作為一種有效的網絡安全解決方案&#xff0c;受到了越來越多的關注。那么高防CDN的防護原理是什么呢?接下來就跟小德一起深入了解下吧! 1. 高防CDN的基本概念 我們要明確什么是…

【云原生 Prometheus篇】Prometheus的動態服務發現機制

自動發現 一、Prometheus服務發現 理論部分1.1 Prometheus數據采集配置1.2 基于文件的服務發現1.3 基于consul的服務發現1.4 基于 Kubernetes API 的服務發現1.4.1 概念1.4.2 部分配置參數1.4.3 配置模板 二、實例一&#xff1a;部署基于文件的服務發現2.1 創建用于服務發現的文…

Spring事務底層原理(待完善)

EnableTransactionManagement 我們經常使用EnableTransactionManagement開啟事務, 這個注解導入一個類,Import(TransactionManagementConfigurationSelector.class), 會在spring容器增加兩個bean, AutoProxyRegistrar和ProxyTransactionManagementConfiguration. AutoProxyRe…