华为仓颉语言初识:并发编程之同步机制(上)
前言
线程同步机制是多线程下解决线程对共享资源竞争的主要方式,华为仓颉语言提供了三种常见的同步机制用来保证线程同步安全,分别是原子操作,互斥锁和条件变量。本篇文章详细介绍主要仓颉语言解决同步机制的方法,建议点赞收藏!
同步机制
原子操作
和 java 一样,仓颉也支持使用原子操作(Atomic)用来确保多线程下的数据访问安全。主要是提供整数类型,布尔类型和引用类型三种方式。
以整数类型为例,原子变量 Atomic 包括 8 位(AtomicInt8) 至 64 位(AtomicInt64)的整数类型,同时支持基本数据的读写。
- 不使用原子操作,在多线程情况下对数据进行累加。
var sum: Int64 = 0for (pattern in 1..100) {spawn {sum += 1 }}sleep(Duration.second*2)AppLog.info("Main===${sum}") //输出 Main===96
- 使用原子变量 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 调用前必须要获取到线程锁,用完必须释放否则会导致其他线程无法获取到锁,本篇文章就先讲这些,已经学会了的小伙伴,赶快动手试试吧!。
相关文章:
华为仓颉语言初识:并发编程之同步机制(上)
前言 线程同步机制是多线程下解决线程对共享资源竞争的主要方式,华为仓颉语言提供了三种常见的同步机制用来保证线程同步安全,分别是原子操作,互斥锁和条件变量。本篇文章详细介绍主要仓颉语言解决同步机制的方法,建议点赞收藏&a…...
php中实现邮件发送功能
要在php项目中实现邮件发送功能,推荐使用phpmailer库通过smtp协议配置。首先安装phpmailer扩展,可通过composer命令composer require phpmailer/phpmailer安装;若未使用composer则手动引入源码。接着配置smtp信息,包括服务器地址&…...

C++之动态数组vector
Vector 一、什么是 std::vector?二、std::vector 的基本特性(一)动态扩展(二)随机访问(三)内存管理 三、std::vector 的基本操作(一)定义和初始化(二…...
arc3.2语言sort的时候报错:(sort < `(2 9 3 7 5 1)) 需要写成这种:(sort > (pair (list 3 2)))
arc语言sort的时候报错:(sort < (2 9 3 7 5 1)) arc> (sort < (2 9 3 7 5 1)) Error: "set-car!: expected argument of type <pair>; given: 9609216" arc> (sort < (2 9 3 )) Error: "Function call on inappropriate object…...
Android动态广播注册收发原理
一、动态广播的注册流程 1. 注册方式 动态广播通过代码调用 Context.registerReceiver() 方法实现,需显式指定 IntentFilter 和接收器实例: // 示例:在 Activity 中注册监听网络变化的广播 IntentFilter filter new IntentFilter…...
Ubuntu 系统通过防火墙管控 Docker 容器
Ubuntu 系统通过防火墙管控 Docker 容器指南 一、基础防火墙配置 # 启用防火墙 sudo ufw enable# 允许 SSH 连接(防止配置过程中断联) sudo ufw allow 22/tcp二、Docker 配置调整 # 编辑 Docker 配置文件 sudo vim /etc/docker/daemon.json配置文件内…...
AI 模型分类全解:特性与选择指南
人工智能(AI)技术正以前所未有的速度改变着我们的生活和工作方式。AI 模型作为实现人工智能的核心组件,种类繁多,功能各异。从简单的线性回归模型到复杂的深度学习网络,从文本生成到图像识别,AI 模型的应用…...

【Zephyr 系列 11】使用 NVS 实现 BLE 参数持久化:掉电不丢配置,开机自动加载
🧠关键词:Zephyr、NVS、非易失存储、掉电保持、Flash、AT命令保存、配置管理 📌目标读者:希望在 BLE 模块中实现掉电不丢配置、支持产测参数注入与自动加载功能的开发者 📊文章长度:约 5200 字 🔍 为什么要使用 NVS? 在实际产品中,我们经常面临以下场景: 用户或…...

【Android】Android Studio项目代码异常错乱问题处理(2020.3版本)
问题 项目打开之后,发现项目文件直接乱码, 这样子的 这本来是个Java文件,结果一打开变成了这种情况,跟见鬼一样,而且还不是这一个文件这样,基本上一个项目里面一大半都是这样的问题。 处理方法 此时遇到…...
n皇后问题的 C++ 回溯算法教学攻略
一、问题描述 n皇后问题是经典的回溯算法问题。给定一个 nn 的棋盘,要求在棋盘上放置 n 个皇后,使得任何两个皇后之间不能互相攻击。皇后可以攻击同一行、同一列以及同一对角线上的棋子。我们需要找出所有的合法放置方案并输出方案数。 二、输入输出形…...

一些免费的大A数据接口库
文章目录 一、Python开源库(适合开发者)1. AkShare2. Tushare3. Baostock 二、公开API接口(适合快速调用)1. 新浪财经API2. 腾讯证券接口3. 雅虎财经API 三、第三方数据平台(含免费额度)1. 必盈数据2. 聚合…...
DeepSeek本地部署及WebUI可视化教程
前言 DeepSeek是近年来备受关注的大模型之一,支持多种推理和微调场景。很多开发者希望在本地部署DeepSeek模型,并通过WebUI进行可视化交互。本文将详细介绍如何在本地环境下部署DeepSeek,并实现WebUI可视化,包括Ollama和CherryStudio的使用方法。 一、环境准备 1. 硬件要…...
机器学习算法时间复杂度解析:为什么它如此重要?
时间复杂度的重要性 虽然scikit-learn等库让机器学习算法的实现变得异常简单(通常只需2-3行代码),但这种便利性往往导致使用者忽视两个关键方面: 算法核心原理的理解缺失 忽视算法的数据适用条件 典型算法的时间复杂度陷阱 SV…...

SSIM、PSNR、LPIPS、MUSIQ、NRQM、NIQE 六个图像质量评估指标
评价指标 1. SSIM(Structural Similarity Index) 📌 定义 结构相似性指数(Structural Similarality Index)是一种衡量两幅图像相似性的指标,考虑了亮度、对比度和结构信息的相似性,比传统的 P…...

【笔记】旧版MSYS2 环境中 Rust 升级问题及解决过程
下面是一份针对在旧版 MSYS2(安装在 D 盘)中,基于 Python 3.11 的 Poetry 虚拟环境下升级 Rust 的处理过程笔记(适用于 WIN 系统 SUNA 人工智能代理开源项目部署要求)的记录。 MSYS2 旧版环境中 Rust 升级问题及解决过…...
centos查看开启关闭防火墙状态
执行:systemctl status firewalld ,即可查看防火墙状态 防火墙的开启、关闭、禁用命令 (1)设置开机启用防火墙:systemctl enable firewalld.service (2)设置开机禁用防火墙:system…...
[论文阅读] 人工智能 | 大语言模型计划生成的新范式:基于过程挖掘的技能学习
#论文阅读# 大语言模型计划生成的新范式:基于过程挖掘的技能学习 论文信息 Skill Learning Using Process Mining for Large Language Model Plan Generation Andrei Cosmin Redis, Mohammadreza Fani Sani, Bahram Zarrin, Andrea Burattin Cite as: arXiv:2410.…...
MS31912TEA 多通道半桥驱动器 氛围灯 照明灯 示宽灯 转向灯驱动 后视镜方向调节 可替代DRV8912
MS31912TEA 多通道半桥驱动器 氛围灯 照明灯 示宽灯 转向灯驱动 后视镜方向调节 可替代DRV8912 产品简述 MS31912 是集成多种高级诊断功能的多通道半桥驱动。 MS31912 具有 12 个半桥,典型工作电压 13.5V 下,每一个半桥支持 1A 电流,典型工…...
软考 系统架构设计师系列知识点之杂项集萃(84)
接前一篇文章:软考 系统架构设计师系列知识点之杂项集萃(83) 第151题 在软件系统工具中,版本控制工具属于(),软件评价工具属于()。 第1空 A. 软件开发工具 B. 软件维…...

矩阵QR分解
1 orthonormal 向量与 Orthogonal 矩阵 orthonormal 向量定义为 ,任意向量 相互垂直,且模长为1; 如果将 orthonormal 向量按列组织成矩阵,矩阵为 Orthogonal 矩阵,满足如下性质: ; 当为方阵时&…...
UDP与TCP的区别是什么?
UDP和TCP是互联网通信中最常用的两种传输层协议,它们在数据传输方式、可靠性、速度和适用场景等方面存在显著差异。本文将围绕UDP与TCP的核心区别展开详细分析,包括连接方式、数据传输机制、传输效率以及各自适合的应用场景,帮助开发者和网络…...
撰写脚本,通过发布/joint_states话题改变机器人在Rviz中的关节角度
撰写脚本,通过发布/joint_states话题改变机器人在Rviz中的关节角度 提问 为我写一个改变关节base_spherical_center_high_joint角度的python脚本吧。适用于ROS2的humble 回答 下面是一个适用于 ROS 2 Humble 的 Python 脚本,它会以指定频率持续发布 …...
AOP实现Restful接口操作日志入表方案
文章目录 前言一、基础资源配置1.操作日志基本表[base_operation_log] 见附录1。2.操作日志扩展表[base_operation_log_ext] 见附录2。3.定义接口操作系统日志DTO:OptLogDTO4.定义操作日志注解类WebLog5.定义操作日志Aspect切面类SysLogAspect6.定义异步监听日志事件…...

【MATLAB去噪算法】基于CEEMDAN联合小波阈值去噪算法(第四期)
CEEMDAN联合小波阈值去噪算法相关文献 一、EMD 与 EEMD 的局限性 (1)EMD (经验模态分解) 旨在自适应地将非线性、非平稳信号分解成一系列 本征模态函数 (IMFs),这些 IMFs 从高频到低频排列。 核心问题:模态混合 (Mode Mixing) 同…...
Webhook 配置备忘
本文地址:blog.lucien.ink/archives/552 将下列代码保存为 install.sh,然后 bash install.sh。 #!/usr/bin/env bash set -e wget https://github.mirrors.lucien.ink/https://github.com/adnanh/webhook/releases/download/2.8.2/webhook-linux-amd64.…...

从理论崩塌到新路径:捷克科学院APL Photonics论文重构涡旋光技术边界
理论预言 vs 实验挑战 光子轨道角动量(Orbital Angular Momentum, OAM)作为光场调控的新维度,曾被理论预言可突破传统拉曼散射的对称性限制——尤其是通过涡旋光(如拉盖尔高斯光束)激发晶体中常规手段无法探测的"…...
机器学习笔记【Week7】
一、SVM的动机:大间隔分类器 1、逻辑回归回顾 假设函数为 sigmoid 函数: h θ ( x ) 1 1 e − θ T x h_\theta(x) \frac{1}{1 e^{-\theta^Tx}} hθ(x)1e−θTx1 分类依据是 h θ ( x ) ≥ 0.5 h_\theta(x) \geq 0.5 hθ(x)≥0.5 为正类&a…...
LSM Tree算法原理
LSM Tree(Log-Structured Merge Tree)是一种针对写密集型场景优化的数据结构,广泛应用于LevelDB、RocksDB等数据库引擎中。其核心原理如下: 1. 写入优化:顺序写代替随机写 内存缓冲(MemTable):写入操作首先被写入内存中的数据结构(如跳表或平衡树),…...

智能推荐系统:协同过滤与深度学习结合
智能推荐系统:协同过滤与深度学习结合 系统化学习人工智能网站(收藏):https://www.captainbed.cn/flu 文章目录 智能推荐系统:协同过滤与深度学习结合摘要引言技术原理对比1. 协同过滤算法:基于相似性的推…...

文档处理组件Aspose.Words 25.5全新发布 :六大新功能与性能深度优化
在数字化办公日益普及的今天,文档处理的效率与质量直接影响到企业的运营效率。Aspose.Words 作为业界领先的文档处理控件,其最新发布的 25.5 版本带来了六大新功能和多项性能优化,旨在为开发者和企业用户提供更强大、高效的文档处理能力。 六…...