華為倉頡語言初識:并發編程之同步機制(上)

前言

線程同步機制是多線程下解決線程對共享資源競爭的主要方式,華為倉頡語言提供了三種常見的同步機制用來保證線程同步安全,分別是原子操作,互斥鎖和條件變量。本篇文章詳細介紹主要倉頡語言解決同步機制的方法,建議點贊收藏!

同步機制

原子操作

和 java 一樣,倉頡也支持使用原子操作(Atomic)用來確保多線程下的數據訪問安全。主要是提供整數類型,布爾類型和引用類型三種方式。

以整數類型為例,原子變量 Atomic 包括 8 位(AtomicInt8) 至 64 位(AtomicInt64)的整數類型,同時支持基本數據的讀寫。

  1. 不使用原子操作,在多線程情況下對數據進行累加。
  var sum: Int64 = 0for (pattern in 1..100) {spawn {sum += 1               }}sleep(Duration.second*2)AppLog.info("Main===${sum}") //輸出  Main===96
  1. 使用原子變量 AtomicInt64 對數據進行累加。
  var sum = AtomicInt64(0)for (pattern in 1..100) {spawn {sum.fetchAdd(1)}}sleep(Duration.second*2)AppLog.info("Main===${sum.load()}")//輸出  Main===99

原子操作 Atomic 使用compareAndSwap 用于數據的交換,使用的和 Java 中一樣的 CAS 同步機制用于確保在多線程的情況下能夠交換成功。

可重入互斥鎖

倉頡語言中同樣支持使用可重入互斥鎖(ReentrantMutex)來解決多線程的同步問題。當一個線程獲取到共享變量的鎖時,在該線程釋放鎖之前,其他線程都無法訪問該共享變量,直到該線程持有的同步鎖釋放。

ReentrantMutex 可重入互斥鎖主要提供了三個方法 ,分別是 lock(),unlock(),tryLock()。lock()和 unlock()總是成對出現的,及對共享變量加完鎖后,等使用結束必須及時釋放鎖。

lock()和unlock()

還是以在多線程下對數據進行累加操作。

  var sum = AtomicInt64(0)let mutex =  ReentrantMutex()for (pattern in 1..100) {spawn {mutex.lock()sum +=1mutex.unlock()}}sleep(Duration.second*2)AppLog.info("Main===${sum}")//輸出  Main===99

ReentrantMutex 作為可重入互斥鎖,當已經獲取互斥鎖的線程再次獲取該互斥鎖時,可以直接獲取。但是該線程獲取幾次互斥鎖就需要釋放幾次鎖。

tryLock()

tryLock 表示線程嘗試去獲取鎖,但是并一定能夠獲取到。可以通過 tryLock()返回到布爾值判斷該線程釋放獲取到鎖,然后調用 unLock 釋放鎖。

Monitor

Monitor 是一個內置鎖,繼承于ReentrantMutex 可重入互斥鎖。Monitor 不僅可以使用 lock(),unlock(),tryLock() 還提供了 wait(),notify(),notifyAll()三個方法用于解決線程間的數據安全問題,這一點和 java 不同,java 中的 Object 提供了 wait(),notify(),notifyAll()三個方法。而 在倉頡中是單獨封裝的類。

下面舉例說明:

let fun = spawn {monitor.lock()while (flag) {AppLog.info("Main=== thread 1 開始執行")monitor.wait()AppLog.info("Main=== thread 1 執行結束")}monitor.unlock()}sleep(Duration.second)monitor.lock()AppLog.info("Main=== 主線程開始執行")flag = false                     AppLog.info("Main===主線程執行結束")                     monitor.notifyAll()                     monitor.unlock()                    fun.get()      //輸出
// Main=== thread 1 開始執行
// Main=== 主線程開始執行
// Main===主線程執行結束
// Main=== thread 1 執行結束

需要注意的是 monitor 的 wait 和 notify/notifyAll 方法使用之前必須要先獲取到鎖,即 lock()。

總結

倉頡中的多線程并發安全同步機制十分重要,對于會 Java 的小伙伴來說簡單容易上手,但是也有一些需要注意的點,比如 notify 調用前必須要獲取到線程鎖,用完必須釋放否則會導致其他線程無法獲取到鎖,本篇文章就先講這些,已經學會了的小伙伴,趕快動手試試吧!。

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

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

相關文章

樹莓派遠程登陸RealVNC Viewer出現卡頓

原因是:沒有連接顯示屏,圖像傳輸會受到限制。 沒有顯示屏怎么解決: 📝 樹莓派5虛擬顯示器配置教程(強制啟用全性能GPU渲染) 🔧 步驟1:安裝虛擬顯示驅動 bash 復制 下載 # 更…

go-zero微服務入門案例

一、go-zero微服務環境安裝 1、go-zero腳手架的安裝 go install github.com/zeromicro/go-zero/tools/goctllatest2、etcd的安裝下載地址根據自己電腦操作系統下載對應的版本,具體的使用自己查閱文章 二、創建一個user-rpc服務 1、定義user.proto文件 syntax &qu…

[BIOS]VSCode zx-6000 編譯問題

前提:Python 3.6.6及以上版本安裝成功,Python 3.6.6路徑加到了環境變量# DEVITS工具包準備好 問題:添加環境變量 1:出現環境變量錯誤,“py -3” is not installed or added to environment variables #先在C:\Windows里…

【Linux】系統部分——進程控制

11.進程控制 文章目錄 11.進程控制一、進程創建二、進程終止退出碼進程終止的方式 三、進程等待進程等待的方式獲取?進程status小程序阻塞與非阻塞等待 四、進程程序替換替換原理進程程序替換的接口——exec替換函數 五、總結 一、進程創建 之前學習了fork()函數創建子進程&a…

【讀論文】U-Net: Convolutional Networks for Biomedical Image Segmentation 卷積神經網絡

摘要1 Introduction2 Network Architecture3 Training3.1 Data Augmentation 4 Experiments5 Conclusion背景知識卷積激活函數池化上采樣、上池化、反卷積softmax 歸一化函數交叉熵損失 Olaf Ronneberger, Philipp Fischer, Thomas Brox Paper:https://arxiv.org/ab…

藍牙音樂(A2DP)音頻延遲的一些感想跟分析,讓你對A2DP體驗更佳深入

零.聲明 最近做藍牙協議棧的過程中遇到一些客戶偶爾提報音頻延遲的問題,所以引發了一些感想,跟大家分享下,音頻延遲主要的影響范圍是對一些要求實時性比較高的場景有比較差的體驗 連接藍牙看視頻的過程中,發現音畫不同步&#x…

MySQL 8.0 綠色版安裝和配置過程

MySQL作為云計算時代,被廣泛使用的一款數據庫,他的安裝方式有很多種,有yum安裝、rpm安裝、二進制文件安裝,當然也有本文提到的綠色版安裝,因綠色版與系統無關,且可快速復制生成,具有較強的優勢。…

AGV|無人叉車工業語音播報器|預警提示器LBE-LEX系列性能與接線說明

LBE-LEX系列AGV|無人叉車工業語音播報器|預警提示器,涵蓋LBE-LEI-M-00、LBE-LESM-00、LBE-LES-M-01、LBE-LEC-M-00、LBE-KEI-M-00、LBE-KES-M-00、LBE-KES-M-01、LBE-KEC-M-00等型號,適用于各種需要語音提示的場景,主要有AGV、AMR機器人、無人…

行為型設計模式之Interpreter(解釋器)

行為型設計模式之Interpreter(解釋器) 前言: 自己的話理解:自定義一個解釋器用來校驗參數或數據是否合法。 1)意圖 給定一個語言,定義它的文法的一種表示,并定義一個解釋器,這個解…

C++常用的企業級日志庫

黃老師跟大家推薦幾款在企業開發中最受歡迎的C++日志庫! 1. spdlog spdlog 是一個非常流行的開源C++日志庫,以其高性能和易用性著稱。它支持多線程、異步日志記錄以及多種格式化選項。 安裝 可以通過包管理器安裝,例如 vcpkg: vcpkg install spdlog示例代碼 #include…

Python讀取PDF:文本、圖片與文檔屬性

在日常的數據采集、文檔歸檔與信息挖掘過程中,PDF格式因其版式固定、內容穩定而被廣泛使用。Python 開發者若希望實現 PDF 內容的自動化提取,選擇一個易用且功能完善的庫至關重要。本文將介紹如何用Python實現 PDF文本讀取、圖片提取 以及 文檔屬性讀取 …

excel中數字不滿六位在左側前面補0的方法

如下圖“代碼”列,想要實現統一的六位,如果不足六位,在前面(左側)補0。 實現方法: 使用公式TEXT(A2,"000000")注意務必是用雙引號。 目標實現: 如果想要脫離原數據,復制…

軟考 系統架構設計師系列知識點之雜項集萃(82)

接前一篇文章:軟考 系統架構設計師系列知識點之雜項集萃(81) 第148題 “41”視圖主要用于描述系統邏輯架構,最早由Philippe Kruchten于1995年提出。其中( )視圖用于描述對象模型,并說明系統應該…

Langgraph實戰--自定義embeding

概述 在Langgraph中我想使用第三方的embeding接口來實現文本的embeding。但目前langchain只提供了兩個類,一個是AzureOpenAIEmbeddings,一個是:OpenAIEmbeddings。通過ChatOpenAI無法使用第三方的接口,例如:硅基流平臺…

(附實例代碼及圖示)混合策略實現 doc-doc 對稱檢索

HyDE 混合策略 在前面的文章中,學習的優化策略都是將對應的 查詢 生成 新查詢,通過 新查詢 來執行相應的檢索,但是在數據庫中存儲的數據一般都是 文檔 層面上的,數據會遠遠比 查詢 要大很多,所以 query 和 doc 之間是…

webui無法注冊如何配置

1. 初始登陸界面 docker部署的腳本為: docker run -d \ -p 8180:8080 --gpusall \ -v ollama:/root/.ollama \ -v /home/pretrained_model/output:/app/backend/output \ --name open-webui \ --restart always ghcr.io/open-webui/open-webui:ollama 2. 新增注冊入…

力扣 88.合并兩個有序數組

文章目錄 題目介紹題解 題目介紹 題解 法一&#xff1a;暴力法 class Solution {public void merge(int[] nums1, int m, int[] nums2, int n) {for(int i 0; i < n; i){nums1[mi] nums2[i];}Arrays.sort(nums1);} }法二&#xff1a;倒序雙指針 時間復雜度為O(mn) 從右…

conda入門

目錄 1. Conda 是什么&#xff1f;2. 為什么需要 Conda&#xff1f;它能解決什么問題&#xff1f;3. Conda 的核心組件和概念4. Conda 基本工作流程和常用命令5. Conda 的主要優勢6. Conda 與 Pip 的關系7. 何時使用 Conda&#xff1f; 1. Conda 是什么&#xff1f; 包管理器&…

UE 5 和simulink聯合仿真,如果先在UE5這一端結束Play,過一段時間以后**Unreal Engine 5** 中會出現顯存不足錯誤

提問 UE5報錯如圖。解析原因 回答 你遇到的這個錯誤提示是&#xff1a; “Out of video memory trying to allocate a rendering resource. Make sure your video card has the minimum required memory, try lowering the resolution and/or closing other applications tha…

第七十三篇 從電影院售票到停車場計數:生活場景解析Java原子類精髓

目錄 一、原子類基礎&#xff1a;電影院售票系統1.1 傳統售票的并發問題1.2 原子類解決方案 二、原子類家族&#xff1a;超市收銀系統2.1 基礎類型原子類2.2 數組類型原子類 三、CAS機制深度解析&#xff1a;停車場管理系統3.1 CAS工作原理3.2 車位計數器實現 四、高性能實踐&a…