C# 验证文件共享模式下的多线程文件写入

目录

写在前面

代码实现 

调用示例

加锁的情况

不加锁的情况

总结


写在前面

原以为设置了文件共享模式为允许随后写入(FileShare.Write),就可以实现多线程下的正常写入操作,实际情况是使用该模式后不会报线程独占问题,但是写入的内容是不完整的,比如开了n个线程,真正写入的内容不仅时序上不连续,且内容也不完整;还是需要额外加锁后才能保证时序及内容的完整性。

代码实现 

using System.Text;

public class Program
{
    static int SuccessCount = 0;
    static int FailureCount = 0;
    static ReaderWriterLockSlim WriteLock = new ReaderWriterLockSlim();
    static object Lock = new object();

    static void Main(string[] args)
    {

        Console.WriteLine("Hello, World!");

        var result = Parallel.For(0, 30, action =>
        {
            WriteTest();
        });

        Console.WriteLine("写入中...");
        Console.ReadLine();
    }

    static void WriteTest()
    {
        try
        {
            WriteLock.EnterWriteLock();
            //lock (Lock)
            //{
                using (FileStream logFile = new FileStream("test.txt", FileMode.OpenOrCreate, FileAccess.Write, FileShare.Write))
                {
                    SuccessCount++;
                    Console.WriteLine("count:" + SuccessCount);
                    var count = SuccessCount;
                    var logContentBytes = Encoding.Default.GetBytes($"{Thread.CurrentThread.ManagedThreadId}, {DateTime.Now.ToString("yyyy-MM-dd:HH:mm:ss:ffff")},{count},{Environment.NewLine}");
                    logFile.Seek(0, SeekOrigin.End);
                    logFile.Write(logContentBytes, 0, logContentBytes.Length);
                }
            //}
        }
        catch (Exception ex)
        {
            FailureCount++;
            Console.WriteLine($"Failure Count:{FailureCount}");
        }
        finally { WriteLock.ExitWriteLock(); }
    }

}

调用示例

加锁的情况

 

不加锁的情况

总结

如果实际应用的话,还是先塞到线程安全的队列中,再用独立线程来写入,来保证效率和一致性。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AWS(三):如何在AwsManagedAd目录和windowsAD实例之间建立双向信任。

前提: 1.创建好了一个AWS managed AD目录,我的目录域名为:aws.managed.com 2.创建好了一个windows AD实例并提升了为域控服务器,实例域名为:aws2.com 看过我AWS 一和二的应该都会创建windows实例了,切记不能将其无缝加入到aws managed AD的…

计算机组成原理 指令

文章目录 指令指令格式和分类指令格式了解指令 按地址码分类按操作码分类按长度分类按操作类型分类 寻址方式指令寻址数据寻址总结 指令集 指令 指令格式和分类 指令格式 #mermaid-svg-STmkVLDKfpWQue8K {font-family:"trebuchet ms",verdana,arial,sans-serif;fon…

捕捉“五彩斑斓的黑”:锗基短波红外相机的多种成像应用

红外处于人眼可观察范围以外,为我们了解未知领域提供了新的途径。红外又可以根据波段范围,分为短波红外、中波红外与长波红外。较短的SWIR波长——大约900nm-1700nm——与可见光范围内的光子表现相似。虽然在SWIR中目标的光谱含量不同,但所产…

AI模型在专用加速器上的性能分析指标

背景:本文是《AI 编译器开发指南》一书的学习笔记。 AI模型在专用加速卡上性能分析大概流程: 1)先计算模型本身的计算访存比,得到模型理论算力带宽需求。 2)根据处理器本身支持的操作字节比(算力&#xf…

次梯度算法介绍

系列文章目录 最优化笔记,主要参考资料为《最优化:建模、算法与理论》 文章目录 系列文章目录一、次梯度1 定义2 存在性 二、次梯度的计算1 按定义计算2 常用计算规则 三、最优性条件1 无约束优化问题2 约束优化问题 四、次梯度算法1 迭代格式2 收敛性 参…

OpenHarmony从入门到放弃(一)

OpenHarmony从入门到放弃(二) 一、OpenHarmony的基本概念和特性 OpenHarmony是由开放原子开源基金会孵化及运营的开源项目,其目标是构建一个面向全场景、全连接、全智能的时代的智能终端设备操作系统。 分布式架构 OpenHarmony采用分布式…

Elasticsearch基本操作之索引操作

本文说下Elasticsearch基本操作之索引操作 文章目录 概述创建索引创建索引示例重复创建索引示例 查看索引查看所有索引查看单个索引 概述 由于是使用命令来操作Elasticsearch,可以使用kibana,postman和apifox等工具 我使用了apifox来执行命令&#xff0c…

macbook电脑2024免费好用的系统清理优化软件CleanMyMac X4.14.7

CleanMyMac X2024来帮助你找到和删除不需要的文件。CleanMyMac X是一款专业的mac清理软件,它可以智能地扫描你的磁盘空间,找出并删除大型和旧文件,系统垃圾,iTunes垃圾,邮件附件,照片库垃圾等,让…

【InnoDB数据存储结构】第2章节:InnoDB行格式

目录结构 之前整篇文章太长,阅读体验不好,将其拆分为几个子篇章。 本篇章讲解 InnoDB 行格式。 InnoDB 行格式 InnoDB 一行记录是如何存储的? 这个问题是本文的重点,也是面试中经常问到的问题,所以就引出了下文的 …

力扣 验证二叉搜索树 递归

👨‍🏫 题目地址 /*** Definition for a binary tree node.* public class TreeNode {* int val;* TreeNode left;* TreeNode right;* TreeNode() {}* TreeNode(int val) { this.val val; }* TreeNode(int val, TreeNode left,…

vc2017编译从github网站上下载的源码

以ZLmediakit为例 1.下载软件 cmakehttps://github.com/Kitware/CMake/releases/download/v3.20.5/cmake-3.20.5-windows-x86_64.zip Microsoft Visual Studio https://my.visualstudio.com/Downloads?qvisual%20studio%202017&wt.mc_ido~msft~vscom~older-downloads …

测评大通关攻略

天下苦测评已久,今天就让我来聊聊测评这回事。首先我们不单独谈银行的测评,银行的第一次笔试经常是超级多的测评,这个测评需要单独谈。我们今天就先来聊聊大多数公司的测评。(本文所用的所有题目均不是本人参加测评所截图的&#…

【数据结构】二叉树的创建和遍历:前序遍历,中序遍历,后序遍历,层次遍历

目录 一、二叉树的定义 1、二叉树的定义 2、二叉树的五种形态 二叉树的子树 : 3、满二叉树与完全二叉树 4、二叉树的性质 5、二叉树的存储结构 1、顺序存储 ​编辑 2、链式存储 二、二叉树的遍历 按照前序序列构建二叉树 1、前 (先) 序遍历(Preorder …

使用Python和Pygame库创建简单的的彩球效果

简介 Pygame是一款强大的游戏开发库,可以用于创建各种有趣的图形效果。为了更好地了解Pygame的功能,今天我们将要做的是在屏幕上随机生成一些彩色的小球,并使它们以不同的速度和方向移动。当小球碰到屏幕边缘时,它们将反弹。 功能…

为什么会去华为 OD?网传的 OD 转华为正编,真的假的?

目录 专栏导读一、为什么会去华为 OD二、华为 OD 的工作内容三、OD 与华为自有员工的对比四、那,到底要不要去华为 OD?五、网传的 OD 转华为正编,真的假的?1、连续两次绩效 A2、通过可信专业级认证 六、最后,真的感谢 …

GitHub上的15000个Go模块存储库易受劫持攻击

内容概要: 目前研究发现,GitHub上超过15000个Go模块存储库容易受到一种名为“重新劫持”的攻击。 由于GitHub用户名的更改会造成9000多个存储库容易被重新劫持,同时因为帐户删除,会对6000多个存储库造成重新劫持的危机。目前统计…

CentOS 7 实战指南:文件或目录的权限操作命令详解

前言 这篇文章详细介绍了文件和目录的常用权限操作命令,并提供了全面的技术解析。通过本文,你将学习如何使用 chmod 和 chown 命令来管理文件和目录的权限,控制用户和用户组的访问权限。无论你是初学者还是有经验的系统管理员,这…

代码随想录刷题笔记(DAY 8)

今日总结:最后一道题解决的比较糟糕,后续会补上新解法,今天还是将中心放在了前端。 Day 8 01. 反转字符串(No. 344) 题目链接 代码随想录题解 1.1 题目 编写一个函数,其作用是将输入的字符串反转过来。…

如何解决大模型的「幻觉」问题?

欢迎关注博主 Mindtechnist 或加入【智能科技社区】一起学习和分享Linux、C、C、Python、Matlab,机器人运动控制、多机器人协作,智能优化算法,贝叶斯滤波与Kalman估计、多传感器信息融合,机器学习,人工智能&#xff0c…

【12】ES6:模块化

一、JavaScript 模块化 JavaScript 模块化是一种组织和管理 JavaScript 代码的方法,它将代码分割为独立的模块,每个模块都有自己的作用域,并且可以导出和导入功能。模块化可以提高代码的可维护性、可重用性和可扩展性。 在JavaScript中&…