多个线程写在同一个文件上

时间:2014-10-25 18:00:56

标签: c multithreading

我想知道我们是否可以使用多个线程在同一个文件上写二进制数据。

FILE *fd = openfile("test");
int SIZE = 1000000000;
int * table = malloc(sizeof(int) * SIZE);
// .. filling the table
fwrite(table, sizeof(*table), SIZE, fd);

所以我想知道我是否可以使用线程,并且每个线程调用fssek来寻找不同的位置来写入同一个文件。

有什么想法吗?

4 个答案:

答案 0 :(得分:1)

fwrite应该是线程安全的,但无论如何你都需要一个互斥锁,因为你需要寻找和写入是原子的。根据您的平台,您可能有一个带偏移量的写入功能,或者您可能能够在每个线程中打开该文件。如果你的代码建议你在内存中拥有所有内容,那么更好的选择就是让每个线程填充到一个大型数组中,然后在完成所有内容时将其写出来。

答案 1 :(得分:1)

虽然fread()fwrite()是线程安全的,但FILE*表示的流缓冲区不是。因此,您可以让多个线程访问同一个文件,但不能通过相同的FILE* - 每个线程必须有自己的,并且它们引用的文件必须是可共享的 - 这取决于操作系统。

另一种可能更简单的方法是使用memory mapped file,以便每个线程将文件视为共享内存,并让操作系统处理文件I / O.与普通文件I / O相比,这具有明显的优势,因为它是真正的随机访问,因此您无需担心fseek()和顺序读/写等。

答案 2 :(得分:0)

fseek和fwrite是线程安全的,因此您无需额外同步即可使用它们。

答案 3 :(得分:0)

让每个线程打开文件,并确保它们写入不同的位置,最后让每个线程关闭文件并完成。

<强>更新

至少在IX'系统中起作用。