当前位置: 首页 > 面试题库 >

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

蒲曦
2023-03-14
问题内容

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


问题答案:

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

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

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

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



 类似资料:
  • 问题内容: 为了使gettimeofday能够正常工作,当前时间必须全局存储,但是我不确定该函数是否修改了任何全局状态,从而并发执行未定义。 问题答案: gettimeofday是线程安全的。 这里列出的(posix)函数可能不是,gettimeofday不是其中之一。

  • 问题内容: 我一直在花一些时间调试一个导致分段错误的程序。该错误是不确定性和断断续续的,这很烦人。我把范围缩小到了。我怀疑是在两个不同的线程中拆分字符串的调用导致了分段错误。我可以在两个不同的线程中调用吗? 谢谢。 问题答案: 不是可重入的,因此不应在线程化应用程序中使用它,而应使用。

  • 我看到了不同的PHP二进制文件,比如非线程或线程安全? 这是什么意思? 这些软件包之间有什么区别?

  • 问题内容: 在中,此变量被声明为是我的问题,在某些调用之后检查值还是在多线程代码中使用perror()是安全的。这是线程安全变量吗?如果没有,那还有什么选择呢? 我在x86体系结构上将Linux与gcc一起使用。 问题答案: 是的,它是线程安全的。在Linux上,全局errno变量是特定于线程的。POSIX要求errno必须是线程安全的。 参见http://www.unix.org/whitepa

  • 问题内容: 我们在项目中使用了Drools kieSessions。许多线程可以创建新的kieSession。有时在创建会话时线程可能会挂起。因此,问题是: 首先 是kieContainer.newKieSession线程安全操作吗? 上吊的原因可能是肮脏的文字或阅读的kie会话集之类的东西吗? 问题答案: 当我在实践中检查 不是线程安全的操作。

  • 问题内容: 在Java中:线程安全吗,即返回的迭代器是在任何时候反映列表的当前状态,还是仅在创建列表时反映列表的状态? 问题答案: List.iterator()的行为未定义或与其他List实现保持一致。 对于ArrayList,LinkedList,如果在迭代列表时对其进行了修改,则可以获得ConcurrentModificationException。(这不能保证)避免此问题的方法是使用syn