我正在使用以下链接中的 C# 代码来实现 Ram-disk 项目。
总而言之,上述代码使用简单的树结构来存储目录、子目录和文件。根是MemoryFolder
存储零个或多个“MemoryFolder”对象和/或对象的MemoryFile
对象。每个MemoryFolder
对象依次存储零个或多个MemoryFolder
对象和/或MemoryFile
对象等,直至无限深度。
但是,代码不是线程安全的。实现线程安全的最优雅的方式是什么?此外,如何通过使用适当的锁定策略来强制执行以下典型文件系统的多线程要求的非详尽列表?
如果线程安全实现允许,可以同时在同一个父文件夹下创建两个不同的文件夹(每个由不同的线程创建)。否则,应该实施一些锁定策略以仅允许顺序创建。
包含特定文件(当前由另一个线程读取)一直传播到根文件夹的文件夹的直接或间接父文件夹都不能被另一个线程移动或删除,直到
ReadFile
线程完成其执行。对于每个唯一文件,允许多个
ReadFile
线程并发访问,但限制对单个WriteFile
线程的访问。如果两个单独的
ReadFile
线程(几乎同时触发),每个来自不同应用程序的线程都试图创建一个同名文件夹(假设在两个线程触发之前该文件夹不存在),进入 Ram-Disk 的第一个线程总是成功,而第二个总是失败。换句话说,线程执行的顺序是确定的。在单独线程下运行的总磁盘空间计算方法
GetDiskFreeSpace
不应完成其执行,直到WriteFile
已经在进行中的所有线程完成其执行。所有未开始执行的后续WriteFile
线程都将被阻塞,直到GetDiskFreeSpace
线程完成其执行。