如何为以下场景使用的树结构实现线程安全

本文关键字:结构 实现 安全 线程 | 更新日期: 2023-09-27 18:10:54

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

  • 链接到源代码描述
  • 链接到源代码

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

然而,代码不是线程安全的。实现线程安全最优雅的方式是什么?此外,如何通过使用适当的锁定策略来实现典型文件系统的以下非详尽的多线程需求列表?
  1. 创建两个不同的文件夹(每个由不同的线程)同时在同一下如果线程安全,父文件夹可以并发发生实现允许这样做。否则,应该使用某种锁定策略

  2. 文件夹的直接或间接父文件夹包含当前由另一个文件读取的特定文件可以移动一直传播到根文件夹的线程或者被其他线程删除,直到ReadFile线程完成它的执行。

  3. 对于每个唯一的文件,允许多个ReadFile线程并发访问,但限制访问单个WriteFile线程。

  4. 如果两个单独的ReadFile线程(几乎同时触发),来自不同应用程序的每个应用程序都尝试创建具有的文件夹相同的名称(假设文件夹不存在)在两个线程被触发之前),第一个进入Ram-Disk总是成功,而第二个总是失败。在其他也就是说,线程的执行顺序是确定的。

  5. 总磁盘空间计算方法GetDiskFreeSpace正在运行在一个单独的线程下不应该完成它的执行,直到所有已经在执行的WriteFile线程完成它的执行。在GetDiskFreeSpace线程完成执行之前,所有未开始执行的WriteFile线程将被阻塞。

如何为以下场景使用的树结构实现线程安全

最简单的方法是使用ReaderWriterLockSlim来保护整个树。它允许多个读取器的并发访问或单个写入器的独占访问。任何以任何方式修改结构的方法都必须获得写锁,并且在该线程释放写锁之前,不允许其他线程读取或写入该结构。

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

可能有一种方法可以使该数据结构无锁。然而,这样做可能相当困难。读/写锁会给你你想要的功能,我怀疑它会足够快。

如果你想跨进程共享这个,那就是另一回事了。ReaderWriterLockSlim不能跨进程工作。但是,您可以使用同步原语的组合来实现类似的东西,或者创建服务于请求的设备驱动程序(或服务),从而将所有这些都保持在同一个进程中。