为什么线程会在读取文件的中途挂起

时间:2014-04-30 15:29:30

标签: c++ nfs

我有一个相当标准的循环来从二进制文件中读入:

char* buffer;    
if(imageData.is_open())
{
    imageData.seekg(0, std::ios::end);
    int filelen = imageData.tellg();
    entrysize = filelen/(hdrDimensions[0] * hdrDimensions[1] * hdrDimensions[2] * hdrDimensions[3]);
    buffer = new char[sizeof(short int)];
    if(entrysize == 2)
    {
        imgDataShort = new std::vector<short int>((hdrDimensions[0] * hdrDimensions[1] * hdrDimensions[2] * hdrDimensions[3]), 0);
        imageData.seekg(0, std::ios::beg);
        int j(0);
        for(int i=0; i < (hdrDimensions[0] * hdrDimensions[1] * hdrDimensions[2] * hdrDimensions[3]); i++)
        {
            imageData.read(reinterpret_cast<char*>(buffer), sizeof(short int));
            memcpy(&(imgDataShort->at(i)), buffer, sizeof(short int));
            j += sizeof(short int);
        }
    }
    delete [] buffer;
}

在这种情况下,读取CT图像。我遇到了一个奇怪的问题,即这个循环挂起大约文件的一半(文件是30MB),进入磁盘睡眠状态。我完全不知道为什么会这样。

详细说明:

为了防止它变得很重要,我在运行busybox的Intel XeonPhi卡上运行它,并且正在从nfs mount读取文件。完全相同的代码在“普通”机器上运行良好。我无法控制nfs配置,但如果某些内容被破坏,显然我可以要求修复它。 mount配置行看起来像(取自df -h):

rw,relatime,vers=3,rsize=32768,wsize=32768,namlen=255,hard,proto=tcp,timeo=600,retrans=2,sec=sys,mountaddr=XXX.XXX.XXX.XXX,mountvers=3,mountport=300,mountproto=udp,local_lock=none,addr=XXX.XXX.XXX.XXX

0 个答案:

没有答案