线程安全文件访问

时间:2013-08-07 13:03:27

标签: c# multithreading

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

1 个答案:

答案 0 :(得分:3)

您的访问权限违规有几种可能原因:

  1. 多个线程专门锁定您的特定.dat文件
  2. 多线程试图读取相同的运行时生成文件
  3. ,这就是多线程
  4. 您的多线程是错误的,因为您的线程在完全生成之前尝试读取运行时生成的文件
  5. 存在以下解决方案:

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

    4. 正如Matthew Watson正确指出的那样,AccessViolationException是由非托管代码中的错误引起的,因此可能不是由多个线程尝试访问同一文件引起的。 因此,我的答案假定您实际上得到UnauthorizedAccessException 如果情况并非如此,并且您确实得到了AccessViolationException您的问题,则最有可能出现在其他地方。