c++ - 当授予对同一文件中的多个线程的读取访问权限时,应用程序卡住了

标签 c++ database-design operating-system

我们在 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

最佳答案

我假设服务器在单个进程上执行,并且这个单个进程正在创建所有创建多线程的作业。因此,所有线程都算作同一进程的线程。

线程具有内存占用空间,允许在同一进程中创建的线程数取决于此占用空间,因为进程也限制了它可以使用的可用内存。 线程的内存占用越大,同一进程中可创建的线程数量就越少。

如果您还没有这样做,作为调查的第一步,请查看:

  1. 您的服务器应用程序同时创建和处理的线程数(作为所有作业的整体)
  2. 重新考虑每个线程维护和使用的堆栈的大小。

关于c++ - 当授予对同一文件中的多个线程的读取访问权限时,应用程序卡住了,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37023675/

相关文章:

c++ - 获取 0 作为堆栈分配数组的大小,其大小在运行时给定

c++ - 如何在 C++ 中使用 HidD_GetHidGuid()?

c++ - 一个程序会分配多少栈内存

c - 如何解决这个链接器错误?

security - 检测和控制未经授权的共享内存读取

c++ - 如何在 Symbian Qt 上的单个 QMainWindow、多个嵌套 QWidgets 应用程序中拥有动态变化的菜单?

database-design - 数据库设计中的循环关系

mysql - 数据库 Upserts - 好的还是坏的做法?

database - 如何正确建模 N :N:1 ternary relationship?

c++ - 多态对象数组