gpt4 book ai didi

c - fopen() 是 Linux 中的线程安全函数吗?

转载 作者:IT王子 更新时间:2023-10-29 00:24:09 41 4
gpt4 key购买 nike

如果我使用 fopen() 调用在多线程中打开同一个文件,并将数据写入文件。我应该使用互斥锁来确保数据不会乱序吗?

最佳答案

如果两个线程都使用 fopen() 打开同一个文件,它们将各自拥有独立的文件流 (FILE *),由引用相同文件的独立文件描述符支持文件。您可以独立地写入两个文件流,但文件的最终结果将取决于线程写入的位置以及它们刷新文件流的时间。除非您控制每个线程写入的位置,否则结果是不可预测的。最简单的事情是确保两个线程使用相同的文件流,但您可能仍需要在线程之间进行协调。请注意,POSIX 要求 C 函数提供对文件流的协调访问 — 参见 flockfile()这强加了要求

All functions that reference (FILE *) objects, except those with names ending in _unlocked, shall behave as if they use flockfile() and funlockfile() internally to obtain ownership of these (FILE *) objects.

如果您在两个线程中以追加模式打开文件,那么每次写入都会安全地到达文件末尾,但您仍然需要担心在缓冲区填满之前刷新数据。

顺便说一句,如果您以追加模式打开文件(O_APPEND 使用 open(),使用 "a"fopen ()),那么所有的写入都应该在文件的末尾,并且你不应该因为交错写入而遇到麻烦——除非,也许,你的独立线程正在使用文件流并且写入超过缓冲区满一次,或者他们在编写每行输出的一部分之后使用 fflush(),或者他们正在使用 write() 或其无数亲戚之一来编写部分每次一行。即使使用追加模式,也有可能遇到问题,但您通常必须尝试遇到这些问题。

关于c - fopen() 是 Linux 中的线程安全函数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16806998/

41 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com