0

我正在使用以下链接中的 C# 代码来实现 Ram-disk 项目。

总而言之,上述代码使用简单的树结构来存储目录、子目录和文件。根是MemoryFolder存储零个或多个“MemoryFolder”对象和/或对象的MemoryFile对象。每个MemoryFolder对象依次存储零个或多个MemoryFolder对象和/或MemoryFile对象等,直至无限深度。

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

  1. 如果线程安全实现允许,可以同时在同一个父文件夹下创建两个不同的文件夹(每个由不同的线程创建)。否则,应该实施一些锁定策略以仅允许顺序创建。

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

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

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

  5. 在单独线程下运行的总磁盘空间计算方法GetDiskFreeSpace不应完成其执行,直到 WriteFile已经在进行中的所有线程完成其执行。所有未开始执行的后续WriteFile线程都将被阻塞,直到GetDiskFreeSpace线程完成其执行。

4

1 回答 1

0

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

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

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

如果您想跨流程共享此内容,那就另当别论了。ReaderWriterLockSlim不适用于跨进程。但是,您可以使用同步原语的组合来实现类似的东西,或者创建一个为请求提供服务的设备驱动程序(或服务),从而将它们保持在同一个进程中。

于 2011-10-11T18:58:52.757 回答