【CPP】多線程并發—— Mutex 和 Lock

#include <iostream>  
#include <thread>  
#include <mutex>  
#include "my_utils.h"std::mutex mtx; // 全局互斥鎖  
int shared_data = 0; // 共享數據  void increment() {  for (int i = 0; i < 10; ++i) {  std::cout <<"increment lock_guard: "<<"\n";std::lock_guard<std::mutex> lock(mtx); // 在這里鎖定互斥鎖  ++shared_data;  std::cout <<"increment: "<<shared_data<<"\n";SLEEP_FOR_500_MS();}  SLEEP_FOR_500_MS();for (int i = 0; i < 10; ++i) {  std::cout <<"increment lock_guard: "<<"\n";std::lock_guard<std::mutex> lock(mtx); // 在這里鎖定互斥鎖  ++shared_data;  std::cout <<"increment: "<<shared_data<<"\n";SLEEP_FOR_500_MS();}  
}  void decrement() {  for (int i = 0; i < 10; ++i) {  std::cout <<"decrement lock_guard1: "<<"\n";std::lock_guard<std::mutex> lock(mtx); // 在這里鎖定互斥鎖  --shared_data;  SLEEP_FOR_500_MS();std::cout <<"decrement: "<<shared_data<<"\n";}  for (int i = 0; i < 10; ++i) {  std::cout <<"decrement lock_guard2: "<<"\n";std::lock_guard<std::mutex> lock(mtx); // 在這里鎖定互斥鎖  --shared_data;  SLEEP_FOR_500_MS();std::cout <<"decrement: "<<shared_data<<"\n";}  
}  int main() {  std::thread t1(increment);  std::thread t2(decrement);  std::cout << "task inited: " << shared_data << std::endl;  t1.join();  t2.join();  std::cout << "Final value of shared_data: " << shared_data << std::endl;  return 0;  
}

運行結果如下:


increment lock_guard: 
increment: 1
task inited: 1
decrement lock_guard1: 
increment lock_guard: 
increment: 2
increment lock_guard: 
decrement: 1
decrement lock_guard1: 
decrement: 0
decrement lock_guard1: 
decrement: -1
decrement lock_guard1: 
decrement: -2
decrement lock_guard1: 
decrement: -3
decrement lock_guard1: 
decrement: -4
decrement lock_guard1: 
decrement: -5
decrement lock_guard1: 
decrement: -6
decrement lock_guard1: 
decrement: -7
decrement lock_guard1: 
decrement: -8
decrement lock_guard2: 
decrement: -9
decrement lock_guard2: 
decrement: -10
decrement lock_guard2: 
decrement: -11
decrement lock_guard2: 
decrement: -12
decrement lock_guard2: 
decrement: -13
decrement lock_guard2: 
decrement: -14
decrement lock_guard2: 
decrement: -15
decrement lock_guard2: 
decrement: -16
decrement lock_guard2: 
decrement: -17
decrement lock_guard2: 
decrement: -18
increment: -17
increment lock_guard: 
increment: -16
increment lock_guard: 
increment: -15
increment lock_guard: 
increment: -14
increment lock_guard: 
increment: -13
increment lock_guard: 
increment: -12
increment lock_guard: 
increment: -11
increment lock_guard: 
increment: -10
increment lock_guard: 
increment: -9
increment lock_guard: 
increment: -8
increment lock_guard: 
increment: -7
increment lock_guard: 
increment: -6
increment lock_guard: 
increment: -5
increment lock_guard: 
increment: -4
increment lock_guard: 
increment: -3
increment lock_guard: 
increment: -2
increment lock_guard: 
increment: -1
increment lock_guard: 
increment: 0
Final value of shared_data: 0

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

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

相關文章

2024年去除視頻水印的5種方法

如果你從事電影剪輯或者視頻編輯工作&#xff0c;你經常需要從優酷、抖音、TikTok下載各種視頻片段……。 通常這些視頻帶有水印和字幕。一些免費軟件如CapCut、canva、Filmora也會給你制作的視頻打上水印&#xff0c;這些水印嵌入在視頻內部。 2024年去除視頻水印的5種方法 …

Mysql-用戶變量的聲明與使用

#聲明變量 #1.標識符不能以數字開頭 #2.只能使用_或$符號&#xff0c;不能使用其他符號 #3.不能使用系統關鍵字 setuserName劉德華; select userName:劉青云;#將賦值與查詢結合 #查詢變量、使用變量&#xff0c;匿名的時候建議加上as select userName as 讀取到的userName變量…

Golang面向對象編程(二)

文章目錄 封裝基本介紹封裝的實現工廠函數 繼承基本介紹繼承的實現字段和方法訪問細節多繼承 封裝 基本介紹 基本介紹 封裝&#xff08;Encapsulation&#xff09;是面向對象編程&#xff08;OOP&#xff09;中的一種重要概念&#xff0c;封裝通過將數據和相關的方法組合在一起…

java JOptionPane 介紹

JOptionPane是Java Swing庫中的一個類,用于創建對話框(Dialogs),以便與用戶進行交互。它提供了一種簡單的方式來顯示消息、警告、錯誤、輸入框等。 主要方法: showMessageDialog(Component parentComponent, Object message):顯示一個包含消息的對話框。showInputDialog…

2024OD機試卷-手機App防沉迷系統 (java\python\c++)

題目:手機App防沉迷系統 題目描述 智能手機方便了我們生活的同時,也侵占了我們不少的時間。 “手機App防沉迷系統”能夠讓我們每天合理地規劃手機App使用時間,在正確的時間做正確的事。 它的大概原理是這樣的: 在一天24小時內,可以注冊每個App的允許使用時段一個時間段只…

Java轉Kotlin調用JNI方法異常

一、背景 Java調用JNI方法時沒有任何問題&#xff0c;但是使用Java轉Kotlin以后出現了崩潰異常&#xff1a;A java_vm_ext.cc:597] JNI DETECTED ERROR IN APPLICATION: jclass has wrong type: 校驗參數后沒有任何變化&#xff0c;經過分析驗證找到解決方案 二、原因…

若依生成樹表和下拉框選擇樹表結構(在其他頁面使用該下拉框輸入)

1.數據庫表設計 生成樹結構的主要列是id列和parent_id列&#xff0c;后者指向他的父級 2.來到前端代碼生成器頁面 導入你剛剛寫出該格式的數據庫表 3.點擊編輯&#xff0c;來到字段 祖籍列表是為了好找到直接父類&#xff0c;不屬于代碼生成器方法&#xff0c;需要后臺編…

【XSRP軟件無線電】基于軟件無線電平臺的QPSK頻帶通信系統設計

目錄&#xff1a; 目錄&#xff1a; 一、緒論 1.1 設計背景 1.2 設計目的 二、系統總體方案 2.1 專題調研題目 2.2 調研背景 2.3 設計任務解讀 2.4 設計原理 2.4.1 原理框圖 2.4.2 功能驗證 三、軟件設計 3.1 程序解讀 3.2 程序設計 3.3 仿真結果&#xff1a; 四、程序代碼分析…

網絡基礎-SSH協議(思科、華為、華三)

SSH&#xff08;Secure Shell&#xff09;是一種用于安全遠程訪問和安全文件傳輸的協議。它提供了加密的通信通道&#xff0c;使得用戶可以在不安全的網絡上安全地遠程登錄到遠程主機&#xff0c;并在遠程主機上執行命令、訪問文件以及傳輸文件&#xff0c;本篇主要講解命令執行…

SpringAI集成本地AI大模型ollama(調用篇)非常簡單!!

一&#xff0c;前提準備本地ai模型 1&#xff0c;首先需要去ollama官網下載開源ai到本地 網址&#xff1a;Ollama 直接下載到本地&#xff0c;然后啟動ollama 啟動完成后&#xff0c;我們可以在cmd中執行ollama可以看到相關命令行 2&#xff0c; 下載ai moudle 然后我們需要…

基于C#開發web網頁模板流程-登錄界面

前言&#xff0c;首先介紹一下本項目將要實現的功能 &#xff08;一&#xff09;登錄界面 實現一個不算特別美觀的登錄窗口&#xff0c;當然這一步跟開發者本身的設計美學相關&#xff0c;像蒟蒻博主就沒啥藝術細胞&#xff0c;勉強能用能看就行…… &#xff08;二&#xff09…

【vector】迭代器

Vector的基本數據結構 可以看到end指向的是數組的最后一個元素&#xff1b; 那么在使用函數遍歷的時候就要注意這種清理&#xff1b; 比如計算一個數組前5個數字的最小值&#xff1b; vector<int> prices{2,1,4,2,0,52,12};auto iter_min min_element(prices.begin(),pr…

NSSCTF | [LitCTF 2023]我Flag呢?

這道題沒啥好說的&#xff0c;題目標簽為源碼泄露&#xff0c;我們直接CtrlU查看網頁源碼就能在最后找到flag 本題完

深入學習指針2

前言 hello,我又來了&#xff0c;今天有我繼續帶領大家深入的學習指針&#xff0c;通過上次的學習&#xff0c;我們已經了解到了指針的基本概念&#xff0c;指針如何使用&#xff0c;指針使用的益處&#xff0c;以及一些相關的概念&#xff0c;那今天我們就繼續深入的學習&am…

Vue3專欄項目 -- 二、自定義From組件(下)

需求分析&#xff1a; 現在我們還需要一個整體的表單在單擊某個按鈕的時候可以循環的驗證每個input的值&#xff0c;最后我們還需要有一個事件可以得到最后驗證的結果&#xff0c;從而進行下一步的操作 如下&#xff0c;我們應該有一個form表單包裹著全部的input表單&#xf…

Java面試八股之Java中的IO流分為幾種

Java中的IO流分為幾種 按數據單位分類&#xff1a; 字節流&#xff08;Byte Stream&#xff09;&#xff1a;以字節&#xff08;8位二進制數&#xff09;為基本單位進行數據讀寫。字節流適合處理所有類型的數據&#xff0c;包括文本、圖像、音頻、視頻等二進制文件。抽象基類…

打破地域界限,HubSpot海外獲客系統引領企業走向國際化

在全球化的浪潮中&#xff0c;企業如何精準把握海外市場、高效獲取并轉化目標客戶&#xff0c;已成為決定其市場地位與未來發展的關鍵因素。HubSpot海外獲客系統以其獨特的視角、強大的功能和卓越的性能&#xff0c;正在引領全球營銷進入一個新的時代。今天運營壇將深入剖析Hub…

阿里巴巴找黃金寶箱(II) - 貪心思維

系列文章目錄 文章目錄 系列文章目錄前言一、題目描述二、輸出描述三、輸入描述四、java代碼五、測試用例 前言 本人最近再練習算法&#xff0c;所以會發布自己的解題思路&#xff0c;希望大家多指教 一、題目描述 一貧如洗的樵夫阿里巴巴在去砍柴的路上&#xff0c;無意中發…

KUKA機器人專業名詞解釋

1、CCU Cabinet Control Unit &#xff08;控制柜控制單元&#xff09; 2、CIB Cabinet Interface Board &#xff08;控制柜接口板&#xff09; 3、HMI Human Machine Interface &#xff08;人機界面&#xff09;&#xff1b;KUKA.HMI 是 KUKA 操作界面。 4、KCB …

工作組PTH

文章目錄 簡述RID 500本地管理員密碼噴灑何為RIP 500 安全標識符SID與RIDPTH為何必須是RID 500CrackMapExec進行密碼噴灑 簡述 在工作組PTH中為什么只有administrator賬號可以,下面進行講解與利用。RID 500本地管理員密碼噴灑 何為RIP 500 安全標識符 安全標識符 安全標識符…