Rust 學習筆記:通過 Send 和 Sync trait 實現可擴展并發性

Rust 學習筆記:通過 Send 和 Sync trait 實現可擴展并發性

  • Rust 學習筆記:通過 Send 和 Sync trait 實現可擴展并發性
    • Send trait:允許在線程之間轉移所有權
    • Sync trait:允許多線程訪問
    • 手動實現 Send 和 Sync 是不安全的
    • 練習題

Rust 學習筆記:通過 Send 和 Sync trait 實現可擴展并發性

處理并發的選項并不局限于語言或標準庫。

你可以編寫自己的并發特性,也可以使用其他人編寫的并發特性。

Send 和 Sync trait 是 Rust 標準庫下的 marker trait。

Send trait:允許在線程之間轉移所有權

Send trait 表明實現 Send 的類型的值的所有權可以在線程之間轉移。

幾乎每個 Rust 類型都是 Send,但也有一些例外,比如 Rc<T>。

Rc<T> 不能實現 Send,因為如果你克隆了一個 Rc<T> 值,并試圖將克隆的所有權轉移給另一個線程,兩個線程可能同時更新引用計數。出于這個原因,Rc<T> 是為在單線程情況下使用而實現的。

Rust 的類型系統和 trait 約束確保不會將非 Send 類型跨線程發送。

任何完全由 Send 類型組成的類型也會自動標記為 Send。

幾乎所有基本類型都實現了 Send,原始指針除外。

Sync trait:允許多線程訪問

Sync trait 表明,從多個線程引用實現 Sync 的類型是安全的。

換句話說,如果 &T(對 T 的不可變引用)實現了 Send,則任何類型 T 都實現了 Sync,這意味著引用可以安全地發送到另一個線程。

與 Send 類似,基本類型都實現了 Sync,完全由實現 Sync 的類型組成的類型也實現了 Sync。

智能指針小結:

  • Rc<T>:沒有實現 Send,也沒有實現 Sync。
  • RefCell<T>:實現 Send(如果 T 實現 Send),沒有實現 Sync。在運行時執行的借用檢查的實現不是線程安全的。
  • Mutex<T>:實現了 Send 和 Sync,可以用于與多個線程共享訪問。
  • MutexGuard<'a, T>:實現 Sync(如果 T 實現 Sync),沒有實現 Send。

手動實現 Send 和 Sync 是不安全的

因為完全由實現 Send 和 Sync 的其他類型組成的類型也會自動實現 Send和 Sync,所以我們不需要手動實現這些特性。

作為 marker trait,它們甚至沒有任何方法來實現。它們只是用于執行與并發相關的不變量。

手動實現這些特征涉及實現 unsafe 的 Rust 代碼。構建不由 Send 和 Sync 部分組成的新并發類型需要仔細考慮以維護安全保證。

練習題

參考視頻:

  1. https://www.bilibili.com/video/BV1LdovYrEVw

假設你正在設計一個數據庫連接的 API:

struct DbConnection { /* ... */ }
impl DbConnection {fn query(&self) -> DbResult {/* ... */}
}

你的數據庫不支持從同一連接進行并發查詢。DbConnection 應該實現哪些 marker trait?

答:Send。

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

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

相關文章

【C++】第十一節—一文詳解vector(使用+楊輝三角+深度剖析+模擬實現+細節詳細補充)

Hi&#xff0c;我是云邊有個稻草人&#xff0c;偶爾中二的C領域博主^(*&#xffe3;(oo)&#xffe3;)^&#xff0c;與你分享專業知識—— C_本篇博客所屬專欄—持續更新中—歡迎訂閱喔 目錄 一、vector的介紹及使用 1.1 vector的介紹 1.2 vector的使用 &#xff08;1&…

華為智選攜手IAM:突破技術邊界,重塑智慧健康家居新時代

華為智選與IAM的聯動創研&#xff0c;是科技與健康兩大領域深度結合的推動者&#xff0c;更是健康智能家電創新的引領者。他們不再只是產品的制造商&#xff0c;而是生活方式的革新者——用創新科技重構健康生活&#xff0c;用智慧生態重塑家居體驗。在這場深度的跨界融合中&am…

基于cornerstone3D的dicom影像瀏覽器 第三十一章 從PACS服務加載圖像

文章目錄 前言一、兩個服務接口1. 查詢檢查接口2. 查詢圖像接口 二、查詢界面組件三、修改歸檔總結 前言 "基于cornerstone3D的dicom影像瀏覽器"系列文章中都是加載本地文件夾的的dicom圖像。 作為一個合格的dicom影像瀏覽器需要對接PACS服務端&#xff0c;從PACS服…

STM32+rt-thread判斷是否聯網

一、根據NETDEV_FLAG_INTERNET_UP位判斷 static bool is_conncected(void) {struct netdev *dev RT_NULL;dev netdev_get_first_by_flags(NETDEV_FLAG_INTERNET_UP);if (dev RT_NULL){printf("wait netdev internet up...");return false;}else{printf("loc…

基于React Native開發HarmonyOS 5.0醫療類應用

隨著HarmonyOS 5.0的發布和React Native技術的成熟&#xff0c;開發者現在可以利用React Native框架為HarmonyOS平臺構建高性能的跨平臺醫療應用。 一、技術選型與優勢 1.React Native HarmonyOS的組合優勢 &#xff08;1&#xff09;跨平臺能力??&#xff1a;React Nati…

姜偉生《統計至簡》

姜偉生《統計至簡》 系列叢書之一 這套書圖真漂亮&#xff0c;字間距也大&#xff0c;特別合適直接作為課件。但是理論上弱&#xff0c;有的地方算法也get不點上。適合初學者&#xff0c;因為能看圖說話&#xff1b;又不適合初學者&#xff0c;因為沒有解析、沒有分析。 這學…

滾動—橫向滾動時,如何直接滾動到對應的內容板塊

使用scrollIntoView方法方法解讀 scrollIntoView 是 HTML 元素&#xff08;HTMLElement&#xff09;的一個方法。當調用該方法時&#xff0c;它會嘗試將調用它的元素滾動到瀏覽器的可視區域內。這個方法特別適用于處理頁面上的滾動行為&#xff0c;比如讓用戶能夠快速定位到頁面…

HTML5 定位網頁元素

1. 定位&#xff08;position&#xff09; position&#xff1a;static&#xff08;標準&#xff09; position&#xff1a;relative&#xff08;相對定位&#xff09; 偏移量的方向 相對定位的規律 浮動元素設置相對定位 position&#xff1a;absolute&#xff08;絕對…

分類數據集 - 植物分類數據集下載

數據集介紹&#xff1a;植物分類數據集&#xff0c;真實場景高質量圖片數據&#xff1b;適用實際項目應用&#xff1a;自然場景植物分類項目&#xff0c;以及作為通用分類數據集場景數據的補充&#xff1b;數據集類別&#xff1a;標注說明&#xff1a;采用文件夾來區分不同的目…

?React Hooks 的閉包陷阱問題

這是主包在面試中遇到的一道題目&#xff0c;面試官的問題是&#xff1a;"這個頁面初次展示出來時Count和step的值是什么&#xff0c;我點擊按鈕count和step的值有什么變化&#xff1f;“ 這個題目主包回答的不好&#xff0c;所以想做一個總結。 題目 import React, { …

新基建浪潮下:中國新能源汽車充電樁智慧化建設與管理實踐

在新基建戰略的強力推動下&#xff0c;中國新能源汽車充電樁建設正迎來智慧化升級的重要機遇期。作為連接能源革命與交通革命的關鍵節點&#xff0c;充電基礎設施的智能化轉型不僅關乎新能源汽車產業的可持續發展&#xff0c;更是構建新型電力系統的重要支撐。當前&#xff0c;…

如何在多任務環境中設定清晰的項目優先級?

在多任務環境中設定清晰的項目優先級需要明確項目戰略價值、緊急性、資源利用效率、風險管理。其中&#xff0c;明確項目戰略價值尤為重要&#xff0c;它決定了項目對組織整體戰略目標實現的貢獻程度。例如&#xff0c;戰略價值高的項目&#xff0c;即使不緊急&#xff0c;也應…

【Django】性能優化-普通版

性能優化&#xff1a; 思路 通常無論是什么編程語言或者是什么框架&#xff0c;瓶頸通常都是數據庫相關的操作&#xff1b; 大部分的查詢慢的問題接口都是頻繁查庫、全盤掃描、多層for循環嵌套、高頻查redis、序列化時多級外鍵&#xff1b; 多用O(1)查找復雜度的數據 合理使…

數據治理域——離線數據開發

摘要 文本主要介紹了離線數據開發相關內容,包括業務與流程、阿里MaxCompute系統設計以及阿里調度系統設計。離線數據開發是大數據開發核心組成部分,用于處理批量數據,支持企業多種需求,其流程涵蓋需求調研、數據源接入等環節。阿里MaxCompute系統架構與特點被闡述,調度系…

python-docx 庫教程

Python-docx 庫介紹 官網文檔 python-docx 是一個用于創建和修改 Microsoft Word (.docx) 文件的 Python 庫。它允許你通過編程方式生成格式化的文檔&#xff0c;添加文本、段落、表格、圖片等元素&#xff0c;而無需依賴 Microsoft Word 應用程序。 主要功能 創建新的 Word…

Ansible小試牛刀

注意事項 除了安裝的zabbix相關組件 使用此腳本安裝的所有軟件版本均為系統默認版本 安裝軟件 zabbix相關組件&#xff0c;包括server&#xff0c;agent等 MySQL Redis NGINX openjdk maven nodejs keepalived iptables ipvsadm 使用劇本 --- - hosts: allname…

MCP使用

什么是MCP Model Context Protocol (MCP) 是由 Anthropic 公司于 2024 年 11 月推出的一種開放協議標準&#xff0c;目的在于標準化LLM 與外部數據源、工具及服務之間的交互方式。MCP 被廣泛類比為“AI 領域的 USB-C 接口” MCP與Function Calling的區別 MCP 的核心概念 1.…

邊緣計算一:現代前端架構演進圖譜 —— 從 SPA 到邊緣渲染

過去十年&#xff0c;前端項目架構經歷了從簡單 HTML 文件到復雜框架的飛躍&#xff0c;但很多開發者忽略了**“渲染位置”與“資源交付方式”**對體驗與性能的根本性影響。 從最初的瀏覽器渲染&#xff0c;到現在“在離用戶最近的地方動態返回 HTML”&#xff0c;架構正在悄悄…

linux學習記錄(六)三個常用命令介紹

1.vim命令 Vim是由Vi發展過來的文本編譯器&#xff0c;其代碼補全、編譯及錯誤跳轉等方便編程的功能特別豐富&#xff0c;在程序員中被廣泛使用。 1.1 語法 vim filename 1.2 vi/vim的使用 vi/vim 共分為三種模式&#xff0c;命令模式&#xff08;Command Mode&#xff09;、…

用Python獲取京東關鍵字接口的用戶指南

在電商數據分析和市場研究中&#xff0c;獲取京東平臺的關鍵字搜索結果數據具有重要意義。本文將詳細介紹如何使用Python調用京東開放平臺的API接口&#xff0c;獲取關鍵字相關的商品數據&#xff0c;并進行解析和處理。 一、準備工作 &#xff08;一&#xff09;注冊京東開發…