线程安全文件访问

本文关键字:访问 文件 安全 线程 | 更新日期: 2023-09-27 18:26:47

我有一个程序可以进行大量比较。它将保存在本地计算机上的特定.dat文件与运行时生成的大量其他文件进行比较。现在我无法使用多个线程执行这些比较,因为有许多System.AccessViolationException。我认为这是因为多个线程试图同时访问同一个本地文件。如何克服这一点,用多个线程进行这些比较?

线程安全文件访问

您的访问违规可能有几个原因:

  1. 多个线程以独占方式锁定您的特定.dat文件
  2. 在多个线程试图读取同一个运行时生成的文件方面,您的多线程是有缺陷的
  3. 您的多线程是有缺陷的,因为您的线程试图在完全生成运行时生成的文件之前读取这些文件

存在以下解决方案:

  1. 将.dat文件读入内存一次,然后在所有线程之间共享该数据。这也减少了I/O负载
  2. 确保每个运行时生成的文件只由一个线程进行比较。这可以通过线程安全队列来实现,该队列包含需要比较的所有文件,并且在所有线程之间共享
  3. 确保只有在完全创建了运行时生成的文件之后,读取线程才能知道该文件。这可以通过在同一磁盘上的不同目录中创建它,并将它移动到目标目录来实现,只有在创建完成后,才能将文件名从解决方案2中放入队列

正如Matthew Watson正确指出的那样,AccessViolationException是由非托管代码中的错误引起的,因此它可能不是由多个线程试图访问同一文件引起的
因此,我的回答假设你实际上得到了一个UnauthorizedAccessException
如果不是这样,并且你确实得到了AccessViolationException,那么你的问题很可能在其他地方。