Rust 中 Mutex 的用法

在 Rust 中,Mutex(互斥鎖)是用于同步并發訪問共享資源的機制。Rust 標準庫中的 Mutex 結構體位于 std::sync::Mutex 中,它提供了線程安全的數據訪問。Mutex 保證了在同一時間只有一個線程可以訪問被鎖定的數據。

以下是 Mutex 的基本用法:

  1. 創建一個 Mutex 對象:
use std::sync::Mutex;let mutex = Mutex::new(0); // 初始化 Mutex,鎖定一個初始值為 0 的數據。
  1. 鎖定 Mutex 以訪問其內部數據:
let mut guard = mutex.lock().unwrap(); // 鎖定 Mutex,unwrap() 用于處理 Result 類型,簡化錯誤處理
*guard += 1; // 通過 MutexGuard 修改內部數據
// 當 MutexGuard 離開作用域時,鎖會自動釋放
  1. 在多線程環境中使用 Mutex
use std::sync::Mutex;
use std::thread;let counter = Mutex::new(0);
let mut handles = vec![];for _ in 0..10 {let counter = counter.clone(); // 克隆 Mutex 以在多個線程中使用handles.push(thread::spawn(move || {let mut num = counter.lock().unwrap();*num += 1;}));
}// 等待所有線程完成
for handle in handles {handle.join().unwrap();
}let result = counter.lock().unwrap();
println!("Result: {}", *result); // 應該輸出 10,但并發錯誤可能導致小于 10 的結果

注意:

  • 使用 Mutex 時需要注意死鎖(deadlock)的情況,確保在獲取鎖之后總是適時地釋放。
  • Mutex::lock() 方法返回一個 Result<MutexGuard<T>, PoisonError<T>>,這是因為如果線程在持有鎖時 panic 了,Mutex 會進入“毒化”狀態。在這種情況下,其他嘗試鎖定 Mutex 的線程將會收到一個 PoisonError。通常,你可以使用 unwrap() 來簡化錯誤處理,但在健壯的生產代碼中,你可能需要更仔細地處理這種潛在的錯誤情況。
  • MutexGuard 結構體實現了 DerefDerefMut,因此你可以直接通過它修改被鎖定的值。
  • 在多線程環境中,雖然 Mutex 可以保證數據訪問的線程安全性,但并不能解決所有并發問題,例如,它不能解決競態條件(race condition)問題。在上述例子中,由于線程調度的不確定性,最終結果可能小于 10。

如果你想避免由于線程調度導致的競態條件,可以考慮使用其他同步原語,如 AtomicUsizeBarrierCondvar 等,或者使用消息傳遞(如使用 mpsc 通道)來避免共享狀態。

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

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

相關文章

畫圖工具之PlantUML插件使用

文章目錄 1 PlantUML插件1.1 引言1.2 什么是PlantUML1.3 PlantUML插件1.3.1 IntelliJ IDEA中插件1.3.2 VS Code中插件1.3.3 使用例子 1.4 PlantUML時序圖語法1.4.1 聲明參與者1.4.2 消息傳遞1.4.2.1 同步消息1.4.2.2 異步消息1.4.2.3 返回消息1.4.2.4 自調用 1.4.3 生命線&…

比特米盒2代刷入ARMBIAN

概述 因為最近在整家庭NAS&#xff0c;類似魔百盒之類的機頂盒無法內置硬盤&#xff0c;所以將目光盯上了比特米盒、私家云以及和逸云&#xff0c;海鮮市場一番對比下來也就比特米盒&#xff08;CM2-B&#xff09;的性價比最高&#xff0c;而且還支持雙盤位&#xff0c;所以采…

【大模型】fineturn Q-wen

github上下載qwen1_5源碼 修改finetun.sh 然后在路徑qwen1_5/examples/sft下修改finetun.sh, 內容如下 #!/bin/bash export CUDA_DEVICE_MAX_CONNECTIONS1 DIRpwd# Guide: # This script supports distributed training on multi-gpu workers (as well as single-worker trai…

批處理--將指定磁盤根目錄所有隱藏的文件(包括文件夾)去除隱藏屬性

如下是實現的腳本&#xff1a;-------------------------------------------------- :loopcd / set /p driverName"請輸入驅動器盤符&#xff08;例如&#xff1a;C或c&#xff09;&#xff1a;"%driverName%: dir /AH %driverName%: pausefor /f "delims"…

Leetcode刷題2

文章目錄 前言尋找兩個正序數組的中位數1?? 雙指針快速排序2?? 第k小數解法 Z 字形變換1?? 個人解法2??巧妙解法13??巧妙解法2 字符串轉換整數 (atoi)1?? 常規方法2?? 作弊方法&#x1f62b; 整數轉羅馬數字1?? 常規方法&#xff1a;按照給定規則寫出判斷條件即…

前端面試題日常練-day32 【面試題】

題目 希望這些選擇題能夠幫助您進行前端面試的準備&#xff0c;答案在文末。 1. 在jQuery中&#xff0c;以下哪個選項用于獲取元素的文本內容&#xff1f; a) text() b) html() c) val() d) attr() 2. jQuery中&#xff0c;以下哪個選項用于在元素上添加一個自定義數據屬性…

感動心靈的聲音——帶情緒的AI配音技術在影視和廣告領域的應用

近年來&#xff0c;隨著人工智能技術的飛速發展&#xff0c;帶情緒的AI配音技術作為其中一項重要應用&#xff0c;正逐漸在影視和廣告行業展現其獨特的魅力和應用價值。傳統的配音工作不僅需要具備優秀的嗓音和表演能力&#xff0c;還要求配音演員能夠準確捕捉并表達角色的情感…

WSL調用docker

WSL&#xff08;windows subsystem linux&#xff09;是window系統的原生linux子系統&#xff0c;用于代碼開發很方便。 希望在wsl里面運行docker&#xff0c;首先要安裝docker在WSL中使用&#xff0c;大部分人的第一想法肯定是用以下命令行安裝&#xff08;個人不推薦&#x…

java的unsafe

在Java中&#xff0c;sun.misc.Unsafe 是一個強大且危險的類&#xff0c;它提供了一些直接操作內存、對象和線程的底層功能。這個類通常不鼓勵普通開發者使用&#xff0c;因為它繞過了Java語言的一些安全性和內存管理機制&#xff0c;可能會導致難以追蹤的錯誤和安全漏洞。 Un…

前端生成二維碼

直接img標簽顯示 npm i use_qrcode npm包地址 <img :src"qrcode" alt"QR Code" /> const txt: any ref(https://baidu.com) const qrcode useQRCode(txt) const qrcodeLogo useQRCode(txt, { logoSrc: https://www.antdv.com/assets/logo.1ef800…

2.go環境配置與開發工具選擇

go 環境配置 下載安裝包 官網(https://go.dev/dl/) 下載地址(國內)(https://golang.google.cn/dl/) 根據自己的操作系統選擇下載即可 下載后安裝 記住地址 比如&#xff1a; D:\work\devtool\go 配置系統環境變量 PATH 指向 go 的安裝 bin 目錄 比如&#xff1a; D:\work…

若依前端vue實現 輸入框下拉選擇加搜索用戶

探索代碼以及詳細的注解 <template><div><el-select v-model"selectedUserId" filterable placeholder"選擇用戶" change"handleChange"><el-optionv-for"user in filteredUsers":key"user.userId":l…

集合框框框地架

這一次來介紹一下常用的集合&#xff1a; 首先是兩種集合的《家庭系譜圖》&#xff1a; 接下來介紹一下集合的種類&#xff1a; Collection Set SetTreeSet&#xff1a;基于紅?樹實現&#xff0c;?持有序性操作&#xff0c;例如&#xff1a;根據?個范圍查找元素的操作。但…

如何使用純原生的ADO.NET技術進行數據讀取

目錄 1. 引用命名空間 2. 創建連接字符串 3. 打開數據庫連接 4. 執行SQL查詢 5. 讀取結果集 6. 處理異常和關閉連接 1. 引用命名空間 在代碼文件中引用幾個關鍵的System.Data.SqlClient命名空間&#xff0c;這些命名空間包含了用于數據庫操作的類。 using System.Data.Sq…

Unity實現TableView

基于Scrollview封裝的TableView&#xff0c;實現對視野外的Cell回收利用&#xff0c;減少創建Cell的開銷。 核心邏輯如下&#xff1a; /***************************************動態使用cell核心邏輯開始 **************************************///計算所有cell的坐標信息 …

利用java8 的 CompletableFuture 優化 Flink 程序,性能提升 50%

你好&#xff0c;我是 shengjk1&#xff0c;多年大廠經驗&#xff0c;努力構建 通俗易懂的、好玩的編程語言教程。 歡迎關注&#xff01;你會有如下收益&#xff1a; 了解大廠經驗擁有和大廠相匹配的技術等 希望看什么&#xff0c;評論或者私信告訴我&#xff01; 文章目錄 一…

flume sink 簡介及官方用例

1、HDFS Sink 此sink將事件寫入 Hadoop 分布式文件系統 &#xff08;HDFS&#xff09; 中。它目前支持創建文本和序列文件。它支持兩種文件類型的壓縮。可以根據經過的時間或數據大小或事件數定期滾動文件&#xff08;關閉當前文件并創建一個新文件&#xff09;。它還按事件起…

AI圖書推薦:用100個ChatGPT提示詞掌握Python編程

《用100個ChatGPT提示詞掌握Python編程》&#xff08;ChatGPT:Your Python Coach Mastering the Essentials in 100 Prompts&#xff09; 塞爾吉奧羅哈斯-加萊亞諾&#xff08;Sergio Rojas-Galeano&#xff09;是一位熱情的計算機科學家&#xff0c;對人工智能、機器學習、進化…

C++中獲取int最大與最小值(補)

上文中&#xff0c;我們學習了C中獲取int最大與最小值的兩種方法&#xff1a;C庫和移位運算&#xff0c;這篇文章將解決在移位運算中遇到的各種報錯&#xff0c;并提出一種新的生成int最值的方法 上文鏈接&#xff1a;http://t.csdnimg.cn/cn7Ad 移位運算取最值常見報錯 Dev…

匯編語言(STC89C52)

指令是計算機計算CPU根據人的意圖來執行某種操作的命令。一臺計算機所執行的全部指令的集合&#xff0c;稱為這個CPU的指令系統。而想要使計算機按照人們的要求完成一項工作&#xff0c;就必須讓CPU按順序執行預設的操作&#xff0c;即逐條執行人們編寫的指令。這種按照人民要求…