多个线程从共享一个处理程序的同一文件读取

时间:2015-07-07 17:11:29

标签: multithreading file c++11

C ++ 11,多平台代码,std::thread的线程。我有一个打开的文件和多个线程,必须从中读取。

前提:起初我只有一个字符串保存文件的路径,然后每个新线程打开文件,从中读取,然后关闭它。这很好用,但在某些时候我意识到这可能有点慢我的目的。所以我现在有一个FILE*在类构造函数中打开并在destroy中关闭,多个线程从同一个文件中读取。只读,不写。

我知道在其他问题上已经讨论了很久,但我没有找到我的具体问题的答案,即:

1)这样做是否安全? 2)让多个线程访问相同的处理程序而不是让每个线程执行打开/关闭任务实际上更快吗? 3)可以O.S.以某种方式干扰我的线程?

一些示例代码:

BEFORE(线程打开/关闭文件):

void continuePreload(int sn, unsigned long ByteSize)
{
    // Open file
    FILE *fpFile = fopen(openFile, "rb");
    // Seek position
    fseek(fpFile, WavePointers[sn] + preloadByteSize[sn], SEEK_SET);
    // Read portion
    fread(&SampleData[sn][preloadByteSize[sn] / sizeof(short)], 1, ByteSize - preloadByteSize[sn], fpFile);
    // Close file
    fclose(fpFile);
}

NOW(线程访问已经打开的文件):

void continuePreload(int sn, unsigned long ByteSize)
{
    // No need to open/close the file again, just seek the position...
    fseek(openFP, WavePointers[sn] + preloadByteSize[sn], SEEK_SET);
    // And read the desired data
    fread(&SampleData[sn][preloadByteSize[sn] / sizeof(short)], 1, ByteSize - preloadByteSize[sn], openFP);
}

1 个答案:

答案 0 :(得分:0)

代码错了。你有一个有多个线程的竞赛访问同一个文件处理程序并移动"当前指针"同时没有任何同步。要使其恢复正常,您需要使用互斥锁保护文件描述符。所有锁定/解锁都会使每个线程打开文件的速度变慢。

您的第一个解决方案更好(正确且快速)。

相关问题