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);
}
答案 0 :(得分:0)
代码错了。你有一个有多个线程的竞赛访问同一个文件处理程序并移动"当前指针"同时没有任何同步。要使其恢复正常,您需要使用互斥锁保护文件描述符。所有锁定/解锁都会使每个线程打开文件的速度变慢。
您的第一个解决方案更好(正确且快速)。