gpt4 book ai didi

写/读文件冲突

转载 作者:太空宇宙 更新时间:2023-11-04 08:24:55 27 4
gpt4 key购买 nike

我正在用 C 语言开发一个小软件,用于在布告栏中读取和写入消息。每条消息都是一个以渐进数字命名的 .txt。

软件是多线程的,有很多用户可以并发操作。

用户可以进行的操作有:

  1. 阅读整个公告板(所有 .txt 文件内容的串联)
  2. 添加一条消息(添加一个名为“id_max++.txt”的文件)
  3. 删除消息。当消息被删除时,该数字中会出现一个空洞(例如,“1.txt”、“2.txt”、“4.txt”),该空洞永远不会被填满。

现在,我想知道是否有一些 I/O 问题 (*) 我应该管理(以及如何)或操作系统(类 Unix)自行解决。

(*) 比如2个用户想要读取和删除同一个文件

最佳答案

因为你有一个类似 Unix 的系统,当文件被另一个线程打开时,操作系统会负责删除文件:目录条目会立即被删除,文件本身(inode)在最后一次关闭时被删除。

我能看到的唯一问题是在目录扫描和文件打开之间:竞争条件可能导致文件已被删除。

恕我直言,您必须简单地考虑到错误文件不存在是正常的,然后转到下一个文件。

你所描述的并不是很糟糕,因为它类似于邮件的 MH 文件夹,并且它可以被许多不同的进程访问,即使涉及锁定。但是根据负载和消息的大小,您可以考虑使用数据库。经验法则(的意见):

  • 很少并发访问和大文件:继续使用文件系统
  • 许多访问和小文件(最多几个 ko):使用数据库

当然,在创建新消息时,您必须使用互斥锁保护例程来查找下一个数字(感谢 @merlin2011 注意到了这个问题)。

您在评论中说您的规范不允许使用数据库。与邮件处理类比,您还可以使用单个文件(如传统邮件格式):

  • 一个文件
  • 每条消息前面都有一个固定大小的标题,表明它是事件的还是已删除的
  • 不需要同步读取权限
  • 写访问必须同步

这将是一个穷人的数据库,其中所有同步都是手动,但每个线程只有一个文件描述符并保存所有打开和关闭操作。在有很多读取和很少的写入或删除的情况下有意义

一个可能的改进是(仍然像邮件阅读器那样)用每条消息的偏移量和状态建立一个索引。根据您的要求,索引可以位于磁盘或内存中。

关于写/读文件冲突,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31067746/

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