C# 如何为用于以下场景的树结构实现线程安全?

C# 如何为用于以下场景的树结构实现线程安全?,c#,.net,windows,filesystems,dokan,C#,.net,Windows,Filesystems,Dokan,我正在使用位于以下链接的C#代码来实现一个Ram磁盘项目 对源代码的描述 到源代码 作为总结,上述代码使用简单的树结构来存储目录、子目录和文件。根目录下是一个MemoryFolder对象,它存储零个或多个“MemoryFolder”对象和/或MemoryFile对象。每个MemoryFolder对象依次存储零个或多个MemoryFolder对象和/或MemoryFile对象,以此类推,深度无限 但是,代码不是线程安全的。实现线程安全最优雅的方式是什么?此外,如何通过使用适当的锁定策略来实施典

我正在使用位于以下链接的C#代码来实现一个Ram磁盘项目

  • 对源代码的描述
  • 到源代码
作为总结,上述代码使用简单的树结构来存储目录、子目录和文件。根目录下是一个
MemoryFolder
对象,它存储零个或多个“MemoryFolder”对象和/或
MemoryFile
对象。每个
MemoryFolder
对象依次存储零个或多个
MemoryFolder
对象和/或
MemoryFile
对象,以此类推,深度无限

但是,代码不是线程安全的。实现线程安全最优雅的方式是什么?此外,如何通过使用适当的锁定策略来实施典型文件系统的以下非详尽的多线程需求列表

  • 在同一个文件夹下同时创建两个不同的文件夹(每个文件夹由不同的线程执行) 如果线程安全,则父文件夹可以同时发生 实现允许它。否则,应该使用一些锁定策略 实现为仅允许顺序创建

  • 该文件夹的直接或间接父文件夹均不存在 包含一个特定文件(当前由另一个文件读取) 线程)可以移动传播到根文件夹的所有路径 或被另一个线程删除,直到
    ReadFile
    线程完成其 执行

  • 对于每个唯一的文件,允许多个
    ReadFile
    线程同时访问,但限制对单个
    WriteFile
    线程的访问

  • 如果两个独立的
    ReadFile
    线程(几乎同时触发), 来自不同应用程序的每个应用程序都尝试使用 相同的名称(假定文件夹不存在) 在触发两个线程之前),进入 Ram磁盘总是成功,而第二个磁盘总是失败。换句话说 换句话说,线程执行的顺序是确定的

  • 总磁盘空间计算方法
    GetDiskFreeSpace
    正在运行 在一个单独的线程下,在所有
    WriteFile
    正在执行的线程完成其执行。所有未开始执行的后续
    WriteFile
    线程将被阻止,直到
    GetDiskFreeSpace
    线程完成其执行

  • 做到这一点最简单的方法是用一根绳子保护整棵树。允许多个读卡器并发访问或单个写卡器独占访问。任何以任何方式修改结构的方法都必须获取写锁,并且在该线程释放写锁之前,不允许其他线程读取或写入该结构

    任何想要读取结构的线程都必须获取读锁。多个读卡器可以同时获取读锁,但是如果一个线程想要获取写锁——这意味着等待所有现有读锁被释放

    可能有一种方法可以使该数据结构无锁。然而,这样做可能相当困难。读写器锁将为您提供所需的功能,我怀疑它足够快

    如果您想在多个流程之间共享这一点,那就另当别论了。
    ReaderWriterLockSlim
    不能跨进程工作。然而,您可以使用同步原语的组合来实现类似的功能,或者创建一个为请求提供服务的设备驱动程序(或服务),从而使其保持在相同的过程中