我们在 delphi 2010 中开发了一个服务器应用程序。
在这种情况下,服务器运行多个线程来访问同一个文件(大小约为 2.5GB),以便在作业 #1(一个大而长的计算作业)中连续访问读取数据。
该文件存储在 win2012 机器上的 240GB SSD 驱动器上。 当此作业 (#1) 正在运行时,不会对同一文件执行任何写入作业。
手头的问题是,当作业 #1 正在运行时,运行的同一服务器 (exe) 在不同的作业上运行不同的线程,无法通过不同的线程(作业)访问/读取不同的文件,在同一驱动器的不同目录上......也 同时我们可以看到 CPU 很低 - 大约 16%。
- 我们应该从哪里开始寻找?
- 这是某种 Windows 文件访问限制吗?
- 这是驱动程序限制吗?
更多信息: 我们使用命令
CreateFileW(FileName, GENERIC_READ, FILE_SHARE_READ OR FILE_SHARE_WRITE, NIL,
OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL OR FILE_FLAG_RANDOM_ACCESS, 0);
其他硬件信息:
- 主板 - Gigabyte x99-Gaming5(intel 芯片组)
- CPU - 英特尔酷睿 i7-5930K
- 内存 - 32GB 2133Mhz
- 操作系统 - Windows 2012R2
- HD - Corsair XT 240GB SSD
最佳答案
我假设服务器在单个进程上执行,并且这个单个进程正在创建所有创建多线程的作业。因此,所有线程都算作同一进程的线程。
线程具有内存占用空间,允许在同一进程中创建的线程数取决于此占用空间,因为进程也限制了它可以使用的可用内存。 线程的内存占用越大,同一进程中可创建的线程数量就越少。
如果您还没有这样做,作为调查的第一步,请查看:
- 您的服务器应用程序同时创建和处理的线程数(作为所有作业的整体)
- 重新考虑每个线程维护和使用的堆栈的大小。
关于c++ - 当授予对同一文件中的多个线程的读取访问权限时,应用程序卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37023675/