一尘不染

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

linux

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


阅读 1153

收藏
2020-06-07

共1个答案

一尘不染

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

引用(FILE *)对象的所有函数(名称以结尾的函数除外)_unlocked都应像它们在内部使用flockfile()funlockfile()获得这些(FILE
*)对象的所有权一样。

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

顺便说一句,如果您以追加模式(O_APPENDwith open(),using "a"with
fopen())打开文件,则所有写操作都应在文件的末尾,并且您不会遇到交错写操作的麻烦—除非,也许您的独立线程正在使用文件流并且一次写入不止一个缓冲区已满,或者它们是fflush()在写入输出的每一行之后使用的,或者它们是在使用write()其众多亲戚中的一个或其每次写入一行的一部分。即使使用追加模式,也有可能遇到问题的方法,但是通常您必须尝试解决这些问题。

2020-06-07