讲师中心 微信公众号
AI工具推荐 视频效率加速

C# 文件锁的公平性 C#如何实现一个公平的读写锁来访问文件

秋磊酱_5468

秋磊酱_5468

发布时间:2026-02-24 12:19:02

|

228人浏览过

|

来源于php中文网

原创

FileShare不保证公平性,仅控制文件打开权限;真正的并发读写协调需用ReaderWriterLockSlim等上层机制配合统一锁实例和规范释放。

c# 文件锁的公平性 c#如何实现一个公平的读写锁来访问文件

FileShare 参数不等于公平性,FileStream 本身不保证读写顺序

很多人以为只要用 FileShare.ReadWrite 就能“公平”处理并发访问,其实这是误解。.NET 的 FileStream 底层依赖操作系统文件句柄,而 Windows/Linux 对文件共享的调度是无序的——先抢到句柄的线程/进程就上,不管它是要读还是写。所谓“公平”,必须靠上层逻辑控制。

  • FileShare 只决定能否同时打开,不干预后续 I/O 的执行时机或优先级
  • 多个线程调用 new FileStream(...) 时,构造函数返回不代表已获得磁盘访问权,真正阻塞可能发生在第一次 Read() 或 Write()
  • 如果写操作耗时长(比如写几百 MB),读线程可能无限期等待,这不是公平,是饥饿

用 ReaderWriterLockSlim 做内存协调,但注意它不锁文件本身

真正的公平读写锁得自己组装:用 ReaderWriterLockSlim 管理“谁可以发起文件操作”,再配合实际的 FileStream 操作。但它只锁代码路径,不锁磁盘,所以必须确保所有文件访问都经过同一把锁实例,且不能绕过。

  • 必须在同一个作用域内创建并复用单个 ReaderWriterLockSlim 实例,不能每次操作都 new 一个
  • 读操作用 EnterReadLock() + TryEnterReadLock() 配合超时,避免写线程长期被饿死
  • 写操作务必用 EnterWriteLock(),且内部要尽快完成 —— 锁住期间其他读写全卡住
  • 记得在 finally 块里调用 ExitReadLock() 或 ExitWriteLock(),否则锁泄漏会导致整个系统僵死
var rwLock = new ReaderWriterLockSlim();
// 读
rwLock.EnterReadLock();
try {
    using var fs = new FileStream(path, FileMode.Open, FileAccess.Read, FileShare.Read);
    // ...读取
} finally { rwLock.ExitReadLock(); }

文件独占写 + 追加模式比“公平读写”更实用

多数场景下,与其费力模拟公平,不如换思路:让写操作走独占、原子、低延迟路径,读操作尽量缓存或降级。例如日志文件、配置快照这类典型用例,写入用 FileMode.Create + FileAccess.Write + FileShare.None,读取则从内存缓存或副本拿。

C#
C#

"避开 C# 常见错误——空陷阱、异步陷阱、LINQ 陷阱及资源泄漏。"

下载
  • FileMode.Append 虽然允许并发打开,但多线程写入仍可能交错(Windows 下尤其明显),不是线程安全的追加
  • 真正安全的追加要用 FileStream.Lock() 手动锁住文件区域,但跨进程无效,且容易死锁
  • 如果必须支持高并发读+偶发写,建议用内存映射文件(MemoryMappedFile)+ 自定义读写计数器,比纯 FileStream 更可控

跨进程公平?别指望 ReaderWriterLockSlim,得用命名同步原语

ReaderWriterLockSlim 是进程内锁,跨进程时完全失效。如果你的程序有多个实例(比如 Windows 服务 + GUI 工具同时操作同一文件),必须升级到系统级同步机制。

  • 用 Mutex 或 Semaphore 配合命名前缀(如 "Global\MyApp_FileAccess"),注意权限问题,普通用户可能无法访问 Global 命名空间
  • EventWaitHandle 可以做读写信号量,但需要你自己维护读计数器和写状态,容易出错
  • 更稳的做法是引入轻量级本地 IPC(比如命名管道或 NamedPipeServerStream),把文件操作收口到一个守护进程里,其他进程只发请求

公平从来不是文件系统的默认属性,而是你对访问路径、资源粒度和错误容忍度权衡后的结果。最容易被忽略的一点:当多个线程都在等同一个文件锁时,它们的等待顺序取决于 OS 调度器,而不是你代码里的 EnterReadLock() 调用顺序。

热门AI工具

更多
Seko
Seko Hot

一款AI视频创作工具,主要用于商汤科技推出的创编一体的AI短视频创作Agent,适合需要提升相关任务效率的用户。

Laper
Laper Hot

Laper是专为编剧、导演和制片人推出的 AI 原生剧本创作工具。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

音述AI
音述AI Hot

一款AI音频处理工具,主要用于音述AI是一个以“用声音述说故事”为核心的 AI 音乐创作与声音分享社区,适合需要提升相关任务效率的用户。

SkildArt
SkildArt Hot

SkildArt是一款AI文本写作工具,一站式 AI 视觉创作平台。

小橡皮AI

一款AI工具,主要用于小橡皮一键去AI味,将机器味重的内容改得更有活人感,防止因为 AI 内容被平台打上 AI 标签,以及限流,适合需要提升相关任务效率的用户。

相关专题

更多
线程和进程的区别
线程和进程的区别

线程和进程的区别:线程是进程的一部分,用于实现并发和并行操作,而线程共享进程的资源,通信更方便快捷,切换开销较小。本专题为大家提供线程和进程区别相关的各种文章、以及下载和课程。

4438

2023.08.10

Python 多线程与异步编程实战
Python 多线程与异步编程实战

本专题系统讲解 Python 多线程与异步编程的核心概念与实战技巧,包括 threading 模块基础、线程同步机制、GIL 原理、asyncio 异步任务管理、协程与事件循环、任务调度与异常处理。通过实战示例,帮助学习者掌握 如何构建高性能、多任务并发的 Python 应用。

1229

2025.12.24

java多线程相关教程合集
java多线程相关教程合集

本专题整合了java多线程相关教程,阅读专题下面的文章了解更多详细内容。

423

2026.01.21

C++多线程相关合集
C++多线程相关合集

本专题整合了C++多线程相关教程,阅读专题下面的的文章了解更多详细内容。

579

2026.01.21

C# 多线程与异步编程
C# 多线程与异步编程

本专题深入讲解 C# 中多线程与异步编程的核心概念与实战技巧,包括线程池管理、Task 类的使用、async/await 异步编程模式、并发控制与线程同步、死锁与竞态条件的解决方案。通过实际项目,帮助开发者掌握 如何在 C# 中构建高并发、低延迟的异步系统,提升应用性能和响应速度。

429

2026.02.06

C++多线程并发控制与线程安全设计实践
C++多线程并发控制与线程安全设计实践

本专题围绕 C++ 在高性能系统开发中的并发控制技术展开,系统讲解多线程编程模型与线程安全设计方法。内容包括互斥锁、读写锁、条件变量、原子操作以及线程池实现机制,同时结合实际案例分析并发竞争、死锁避免与性能优化策略。通过实践讲解,帮助开发者掌握构建稳定高效并发系统的关键技术。

253

2026.03.16

Java 多线程与并发编程实战
Java 多线程与并发编程实战

深入讲解 Java 并发编程体系,涵盖 Thread / Runnable / Callable 线程创建方式、线程生命周期与状态转换、synchronized 同步锁与 Lock/ReentrantLock 显式锁、volatile 可见性保证、ThreadPool 线程池配置与调优(核心参数/拒绝策略)、JUC 并发工具类(CountDownLatch/CyclicBarrier/Semaphore/ConcurrentHashMa

369

2026.04.17

C++ 多线程使用教程大全
C++ 多线程使用教程大全

系统讲解 C++11 及后续标准引入的多线程编程能力,涵盖 std::thread 线程创建与生命周期管理、std::mutex / shared_mutex 互斥锁与读写锁、std::condition_variable 条件变量同步、std::atomic 原子操作与内存序(memory_order)、std::future / promise / async 异步任务、线程池的设计与实现、死锁检测与避免策略,帮助开发者编写正确高效

216

2026.04.28

Vite 项目如何打包和部署
Vite 项目如何打包和部署

Vite项目打包部署专题汇集生产构建、产物预览、输出目录、资源路径、Nginx与GitHub Pages部署及常见白屏和路由404问题的已审核文章,帮助读者完成上线流程。

40

2026.10.28

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn