【问题标题】:File read access from threads来自线程的文件读取访问
【发布时间】:2013-06-11 17:24:13
【问题描述】:

我有一个静态类,其中包含许多从配置文件中读取值的函数。配置文件随软件一起提供,软件本身从不写入它们。

我的应用程序中有许多线程正在运行,我需要调用静态类中的一个函数。然后该函数将转到其中一个配置文件,查找一个值(取决于我在调用该函数时传递的参数),然后返回一个结果。

我需要线程能够同时读取所有文件(或者更确切地说,不同步到主线程)。线程永远不会写入配置文件。

因此,我的问题很简单,允许多个线程调用相同的静态函数同时从同一个文件中读取值会有什么问题吗?我可以理解,如果某些线程正在写入文件而其他线程正在读取文件,则会出现序列化问题,但这永远不会发生。

基本上:
1. 多线程同时读取同一个文件有什么问题吗?
2. 允许多个线程同时调用同一个静态函数(在同一个静态类中)有什么问题吗?

【问题讨论】:

  • 只是备注.. 您可能想为配置编写一个包装类,将配置保存在内存中,而不是从文件中一遍又一遍地读取配置。最后将文件的读取封装在这样的类中会好很多。
  • 配置文件包含数百行信息。我将一个值传递给一个函数,该函数读取文件并返回与我传入的值相关的配置信息。我认为不时读取文件而不是将整个内容存储在内存中的内存密集度较低,因为我不需要所有的信息。
  • 总的来说,我很欣赏您努力创建优化软件的事实,但您在 Delphi 软件上工作,这通常意味着您的代码已经有十多年的历史了,它还可以运行又一个十年。您现在可以以不到 80 欧元的价格获得 24GB,因此在牺牲软件的可维护性以节省数千字节的 RAM 之前,最好三思而后行。
  • 我同意你的观点,但该应用程序是相当密集的处理器,我们必须记住,我们的一些客户在非常低规格的 PC 上运行它,所以在这种情况下它更有意义与将大量不必要的信息读入内存相比,I/O 操作的开销可能会对我们的大部分客户群产生连锁反应。不过,感谢您的回复。

标签: multithreading delphi


【解决方案1】:

是的,这可能是一个问题,这取决于类实际定位和读取文件的方式,如果类还缓存值,则更是如此,因此它不需要每次都从文件中读取。如果没有看到你的类的实际代码,就无法告诉你你的代码是否是线程安全的。

【讨论】:

  • 好的,所以基本上,我目前正在处理的文件包含几百行信息,每行分为几个部分。我在调用的静态类中有一个函数,传入一个参数。该函数打开文件,读取它,直到它到达我传递给函数的值,然后返回与该值相关的配置信息(基本上是内容线)。由于该函数没有向文件写入任何内容,并且没有缓存任何内容,因此多个线程调用同一个函数是否会出现问题?
  • 如果函数重新打开文件,从中读取相关数据,然后在退出前关闭文件(如果不是文件 I/O 的一个非常有效的模型,这本身就是一个),那么这通常是线程安全的,只要函数使用文件句柄/指针的局部变量。对文件的每次访问都将使用不同的文件句柄/指针来访问数据,这将是线程安全的。
  • 和我想的一样(虽然我有一些疑问)。感谢您的确认!
猜你喜欢
  • 1970-01-01
  • 2017-03-22
  • 1970-01-01
  • 1970-01-01
  • 2017-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多