aardio - 【库】lock 跨进程读写锁

news2024/11/28 12:40:27

import win.ui;
/*DSG{{*/
var winform = win.form(text="aardio form";right=272;bottom=203;topmost=1)
winform.add(
button={cls="button";text="无锁演示";left=27;top=132;right=120;bottom=184;z=2};
button2={cls="button";text="有锁演示";left=139;top=132;right=232;bottom=184;z=3};
edit={cls="edit";text="0";left=54;top=26;right=206;bottom=109;edge=1;font=LOGFONT(h=-16);multiline=1;z=1}
)
/*}}*/

import godking.lock;
import raw.struct;
var lock = godking.lock();
var data = ..raw.struct({int v});
winform.button.oncommand = function(id,event){
	winform.button.disabled = true;
	winform.button2.disabled = true;
	for(i=1;5;1){
		thread.invoke( 
			function(data){
				while(1){
					import console;
					console.dump("正在写=====");
					thread.delay(1000);
					data.v++;
					console.dump("已写完");
				}
			},data
		)
	}
	thread.invoke( 
		function(data,winform){
				while(1){
					thread.delay(1000);
					winform.edit.text = data.v;
				}
		},data,winform
	)
}

winform.button2.oncommand = function(id,event){
	winform.button.disabled = true;
	winform.button2.disabled = true;
	// 创建 5 个线程,使用【写锁】,进行数据写入。
	for(i=1;5;1){
		thread.invoke( 
			function(data,lock){
				import godking.lock;
				import console;
				lock = godking.lock(lock);
				while(1){
					lock.write();
						console.dump("--------------------进入【写锁】,数值 +1 √√√√√√√√√√√√√√√√√√√√√√");
						thread.delay(1000);
						data.v++;
						console.dump("即将退出【写锁】");
					lock.endWrite();
				}
			},data,lock
		)
	}
	// 创建 1 个线程,使用【读锁】,进行数据读取。
	thread.invoke( 
		function(data,winform,lock){
				import godking.lock;
				import console;
				lock = godking.lock(lock);
				while(1){
					lock.read();
						console.dump("--------------------进入【读锁】,此时不在【写锁】内,数值是不会 +1 的。-------------");		
						thread.delay(1000);
						winform.edit.text = data.v;
						console.dump("即将退出【读锁】");
					lock.endRead();
				}
		},data,winform,lock);
	// 创建 1 个线程,不加锁,进行数据读取。
	thread.invoke( 
		function(data,winform){
				import console;
				while(1){
					console.dump("无锁读,不受锁影响");
					thread.delay(200);
					winform.edit.text = data.v;
				}
		},data,winform);
}

winform.show();
win.loopMessage();

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1851426.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

CausalMMM:基于因果结构学习的营销组合建模

1. 摘要 在线广告中,营销组合建模(Marketing Mix Modeling,MMM) 被用于预测广告商家的总商品交易量(GMV),并帮助决策者调整各种广告渠道的预算分配。传统的基于回归技术的MMM方法在复杂营销场景…

修复 Android 手机卡在启动屏幕上的 7 种方法

Android 手机卡在启动屏幕上的情况并不常见。通常,问题出现在应用新更新或安装未知来源的应用程序后。幸运的是,您可以让您的 Android 手机跳过启动屏幕,而无需前往最近的服务中心。 当您的 Android 手机在启动屏幕上陷入无限循环时&#xf…

MSPM0G3507——PWM

在sysconfig中,左侧可以选择MCU的外设,我们找到并点击TIMER-PWM选项卡,在TIMER-PWM中点击ADD,就可以添加定时器下的PWM外设。 这里设置通道0为100Hz的频率,0%占空比的PWM,周期计数值为1000,比较…

有哪些骨传导耳机是比较推荐入手的?精选五款热门骨传导耳机推荐!

耳机基本是每人人手一台,不管是在地铁上还是在公交上,都可以看到很多人戴着耳机度过空余的时光,甚至现在人们在耳机的选择方面更加偏向于骨传导耳机,开放耳道的奇特设计在户外佩戴的时候可以更好的感知到周围的环境音,…

面试突击:深入理解 Java 中的异常

本文已收录于:https://github.com/danmuking/all-in-one(持续更新) 前言 哈喽,大家好,我是 DanMu。今天想和大家聊聊 Java 中的异常。异常处理是一种重要的概念,因为程序总是会出现各种意料之外的问题&…

分享计算机msvcp100.dll,丢失或找不到的7个解决方法

msvcp100.dll是动态链接库文件对于执行使用 Microsoft Visual C 2010 编译器编译的应用程序至关重要。它包含了 C 标准库的实现,提供了应用程序运行时所需的核心功能,如输入/输出操作、字符串处理、数学运算和异常处理等。若系统中缺失或损坏此文件&…

win10环境配置ollama-ui运行llama3模型

先说我的笔记本电脑配置intel-i7-11390h,4核8处理器,内存16G。显卡NVIDA GeFroce MX450,2G显存,这是一台5000元左右的电脑。 我用它跑roop、sd1.5、ffusion2、ChatTTs还有pythonpytorch的自定义模型,现在用来跑llama3。当然&…

挑战Midjourney,融合近百个SD大模型的通用模型AlbedoBase XL

在SDXL的通用模型中,DreamShaperXL和juggernautXL这2款大模型一直都深受广大AI绘画者的喜爱,不可否认,这2款通用模型在很多方面表现都相当出色。 今天再给大家介绍一款基于SDXL的通用大模型:AlbedoBase XL,作者的目标…

Centos7 Mysql8.3.0 安装地址

MySQL :: Download MySQL Community Server (Archived Versions)

qt 5.6 qmake手册

qt 5.6 qmake手册 (笔者翻译的qmake手册,多数是机翻,欢迎评论区纠错修正) Qmake工具有助于简化跨不同平台开发项目的构建过程。它自动生成Makefile,因此创建每个Makefile只需要几行信息。您可以将qmake用于任何软件项目…

解决 执行 jar 命令 控制台乱码

Springboot项目,编码为utf8 打包后,为了在控制台运行时不乱码,需要在控制台中依次执行以下命令: 第一步: chcp 65001第二步: java -jar -Dfile.encodingutf-8 你的.jar

使用 GitOps 进行防灾 MinIO

想象一下,您已经花费了无数小时来完善 Docker Swarm 设置,精心设计每项服务,并调整 CI/CD 管道以实现无缝自动化。现在,想象一下这个经过微调的系统被重置为原点,不是因为严重的故障或安全漏洞,而是因为数据…

windows下mysql修改 my.ini的datadir后 `Access denied`

1. 背景 window安装mysql数据库时,不能指定数据文件存放位置(默认安装路径 "C:/ProgramData")。 只能通过修改mysql.ini来更改数据文件存放目录。 2. 问题: 修改mysql.ini后,mysql 出现 "Access denied for user ‘root‘@‘localhost‘ (using passwor…

如何清除anaconda3缓存?

如果长期使用anaconda不清理缓存,会导致anaconda占用磁盘空间越来越多,甚至系统磁盘撑爆。 清除包缓存: 打开 Anaconda Prompt 或者命令行窗口。运行以下命令清除包缓存:conda clean --all这会清除所有的包缓存,释放磁…

调试实战 | 记一次有教益的 vs2022 内存分配失败崩溃分析(续)

前言 前一阵子遇到了 vs2022 卡死的问题,在上一篇文章中重点分析了崩溃的原因 —— 当 vs2022 尝试分配 923MB 的内存时,物理内存页文件大小不足以满足这次分配请求,于是抛出异常。 本篇文章将重点挖掘一下 vs2022 在崩溃之前已经分配的内容…

关于使用绿联 USB-A转RJ45 2.5G网卡提速的解决问题

问题 网络下载速率低 网线是七类网线,外接的USB网卡驱动 我的自带网卡是 I219v 在嵌入了2.5G网络后一直无法到达1.5G以上。 平均测速300~500M 解决方案 更新了USB的网卡驱动 禁用了 I219-V的驱动。测速即可 USB驱动下载地址 https://download.csdn.net/downlo…

2024 年值得考虑的 5 款 PDF 转换器

您可以使用名为PDF 转换器(可移植文档格式)的软件应用程序将数据从一种格式转换为另一种格式,具体来说就是转换为 PDF 格式或从 PDF 格式转换为 PDF 格式。由于无论使用什么程序或平台查看,PDF 格式的格式和布局都保持不变&#x…

教育培训机构寒暑假班学校公众号小程序

📚教育培训学校公众号版本:开启学习新纪元🚀 一、引言:为何教育培训学校需要公众号版本? 随着数字化时代的来临,传统教育培训行业也在不断探索新的服务模式。公众号作为新媒体平台的一种,具有信…

网络安全知识全景地图V1.0 - 20240616更新

网络安全领域的知识全景涵盖了从基础概念到高级技术的广泛内容。博主基于自身十年多的工作经验结合CISSP认证官方教材按照不同的主题和层次梳理出如下高层次的概览地图,可以帮助个人和组织理解网络安全领域的主题。 1.1. 基础理论 1.1.1. 网络安全概述 网络安全的…

反激开关电源输出电解电容选型及计算

电容高频模型:ESRESLC的串联 1、耐压:根据输出的电压来取,需留一定余量,比如5V输出可以选6.3V或者10V的电解电容 2、容量 纹波电压 电容充放电引起的纹波电压(与电容容量存在着直接因果关系) ESR引起的纹…