所以,假设我有以下代码,我打开一个文件,逐行读取内容,然后在其他地方使用每行代码,然后当我完成文件的倒带时。
FILE *file = Open_File();
char line[max];
while (!EndofFile())
{
int length = GetLength(line);
if (length > 0)
{
DoStuffToLine(line)
}
}
rewind(file);
我想知道是否有办法在这里使用线程来添加并发性。因为我只是在阅读文件而不是写信给我,所以我觉得我不必担心比赛条件。但是我不确定如何处理while循环中的代码,因为如果一个线程在文件上循环而另一个线程同时在文件上循环,它们是否会导致彼此跳过线,使其他错误等?有什么方法可以解决这个问题?
答案 0 :(得分:2)
如果您尝试这样做以提高读取性能,那么您可能会感到失望,因为这几乎肯定会受到磁盘I / O限制。添加更多线程无助于操作系统和磁盘控制器更快地获取数据。
但是,如果你想要并行处理数据,那就另当别论了。在这种情况下,我会将整个文件读入某个内存缓冲区,然后让你的线程并行处理它。这样你就不用担心重写文件指针或任何其他类似烦人的问题时的线程安全。
当然,您可能仍需要为多线程部分使用其他锁定机制,具体取决于您正在做什么,但您不必担心标准库在您启动时将要执行的操作访问具有多个线程的文件。
答案 1 :(得分:1)
并发性增加了一些竞争条件问题:
1。在循环开始时评估EndofFile()函数,可能总是会发生这个函数为两个线程返回true,然后一个线程到达文件末尾而另一个线程到达文件末尾线程尝试读取文件。你永远不知道线程何时可能正在执行;
2. 相同对GetLength函数有效:当一个线程有长度信息时,长度可能会改变,因为另一个线程可能会读取另一条线;
3。您正在按顺序读取文件,即使您回放它,也可能始终发生IO指针的当前位置被其他某个线程更改。
此外,正如Telgin所指出的那样,读取文件不是CPU绑定的,而是I / O绑定,系统读取文件也是如此。由于需要一些锁定,锁定以保证不能提高性能线程安全只是引入开销。
答案 2 :(得分:0)
我不确定这是最好的方法。但是,您可以阅读该文件。然后将其存储在两个单独的对象中,并读取对象而不是文件。请确保之后进行清理。