当前位置: 首页 > news >正文

多线程资源占用问题

1.常见的会引起资源冲突的

·文件系统资源:多个线程同时读取,写入或删除同一文件或目录时

·数据库资源: 多线程并发访问和修改同一数据库记录(缺乏事务控制或锁定机制),多个线程或进程使用数据库连接资源时,可能导致连接超时或连接耗尽。

·内存资源: 多线程同时访问或修改静态(全局)变量时可能引发竞争条件,导致数据不一致出错

·网络资源:同时范文或操作同一个网络套接字(如发送和接受数据)可能会引发冲突,导致数据包丢失或混乱;多个进程绑定同一端口等;

·硬件资源:多线程同时访问打印机,扫描仪可能会引起冲突。

·配置文件: 多线程同时读取或写入同一配置文件

·日志文件:多线程同时写入同一个日志文件

2.常用的解决资源冲突的方法

内存映射文件(内容映射到进程的虚拟地址中)、临时文件缓存(本地副本文件)、内存流(内存中(堆)划一块区域存储临时文件)

 //防止资源占用,使用内存流存储数据byte[] pixels;int width, height;using (Bitmap bitmap = new Bitmap(patientMsg.PicturePath)){width = bitmap.Width;  // 保存宽度信息height = bitmap.Height; // 保存高度信息using (MemoryStream ms = new MemoryStream()){bitmap.Save(ms, System.Drawing.Imaging.ImageFormat.Bmp); // 将图片保存到内存流pixels = ms.ToArray(); // 将图片数据转换为字节数组,传输和存储本地等方便,需要再转为bitmap}}MemoryByteBuffer buffer = new MemoryByteBuffer(pixels);

适用场景:文件系统资源

访问非常大的文件(如图像文件),如果是很小的文件,用锁就行了

通过async和await实现异步网络操作,在不阻塞主线程的情况下处理多个网络请求

适用场景: 网络资源,数据库资源

对于数据库资源可能存在的高并发访问的场景,应该使用数据库连接池会更好

 在Program.cs 配置// 添加DbContext服务,配置连接池,可以应对高并发services.AddDbContextPool<AppDbContext>(options =>options.UseSqlServer(connectionString));// 添加DbContext服务,不配置连接池services.AddDbContext<AppDbContext>(options =>options.UseSqlServer(connectionString));

适用场景:数据库资源

EFCore是实现了优秀的连接池管理

使用各种锁(互斥锁,读写锁)来禁止多线程同时访问同一资源

    static int sharedResource = 0;static readonly object mutex = new object();static void Increment(){for (int i = 0; i < 10000; i++){lock (mutex){sharedResource++;}}}

适用场景:内存资源

锁内的执行步骤应该较为简单,且执行不需要耗费太长时间。

 单例模式只有一个全局实例负责配置文件的操作,从而避免多个实例同时访问配置文件可能带来的竞争问题。

public class DicomLogger{private static readonly Lazy<DicomLogger> instance = new Lazy<DicomLogger>(() => new DicomLogger());private string logFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "Logs", "log.txt");//路径private DicomLogger(){string logDirectory = Path.GetDirectoryName(logFilePath);if (!Directory.Exists(logDirectory)){Directory.CreateDirectory(logDirectory);}Log.Logger = new LoggerConfiguration().MinimumLevel.Information().WriteTo.RollingFile(logFilePath).CreateLogger();}}public class DicomConfigurationManager{private static readonly Lazy<DicomConfigurationManager> instance = new Lazy<DicomConfigurationManager>(() => new DicomConfigurationManager());      //仅首次访问instance实例化private DicomConfigData configData;private string pacsConfigFilePath = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "PacsConfig.ini");private readonly object _lock = new object();private DicomConfigurationManager(){configData = LoadConfiguration() ?? new DicomConfigData();}}

适用场景:硬件资源、配置文件、日志文件

注意单例的实现方式。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【对商城小程序命名的一些建议】
  • SpringBoot3
  • 算法刷题笔记 筛质数(详细注释的C++实现,同时包含朴素筛法、埃氏筛法和线性筛法详细介绍)
  • 2024最新 Jenkins + Docker实战教程(九)- Jenkins实现嵌入式系统的自动化流程
  • Java框架Spring(一)
  • QT+OSG显示一个三维模型
  • 又一个强大的开源编辑器Vditor
  • safari扩展程序开发
  • 03_React 收集表单数据和 组件生命周期
  • 【drools】Rulesengine构建及intelj配置
  • 怎样写好提示词(Prompt) 二
  • ETAS工具链自动化实战指南<二>
  • 图像处理 -- 图像清晰度测量方法
  • Vue3项目开发——新闻发布管理系统(四)
  • 【解压即玩】使命de召唤4
  • 【译】JS基础算法脚本:字符串结尾
  • 《Javascript高级程序设计 (第三版)》第五章 引用类型
  • ES2017异步函数现已正式可用
  • python docx文档转html页面
  • Theano - 导数
  • 搭建gitbook 和 访问权限认证
  • 使用 5W1H 写出高可读的 Git Commit Message
  • 通信类
  • 微信小程序实战练习(仿五洲到家微信版)
  • 我的zsh配置, 2019最新方案
  • 想晋级高级工程师只知道表面是不够的!Git内部原理介绍
  • 再次简单明了总结flex布局,一看就懂...
  • 自制字幕遮挡器
  • 分布式关系型数据库服务 DRDS 支持显示的 Prepare 及逻辑库锁功能等多项能力 ...
  • ​Linux·i2c驱动架构​
  • # Swust 12th acm 邀请赛# [ E ] 01 String [题解]
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • (02)vite环境变量配置
  • (2024,RWKV-5/6,RNN,矩阵值注意力状态,数据依赖线性插值,LoRA,多语言分词器)Eagle 和 Finch
  • (AtCoder Beginner Contest 340) -- F - S = 1 -- 题解
  • (ISPRS,2023)深度语义-视觉对齐用于zero-shot遥感图像场景分类
  • (补充)IDEA项目结构
  • (多级缓存)多级缓存
  • (篇九)MySQL常用内置函数
  • (十)T检验-第一部分
  • (数据大屏)(Hadoop)基于SSM框架的学院校友管理系统的设计与实现+文档
  • (四)模仿学习-完成后台管理页面查询
  • (算法)N皇后问题
  • (算法)硬币问题
  • (转)scrum常见工具列表
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • *Django中的Ajax 纯js的书写样式1
  • .Net 6.0--通用帮助类--FileHelper
  • .Net Core 笔试1
  • .NET Core 中插件式开发实现
  • .NET Framework 3.5安装教程
  • .NET 快速重构概要1
  • .NET单元测试使用AutoFixture按需填充的方法总结
  • .net开源工作流引擎ccflow表单数据返回值Pop分组模式和表格模式对比
  • .NET牛人应该知道些什么(2):中级.NET开发人员