【问题标题】:Is tellp safe to use with file locking与文件锁定一起使用tellp是否安全
【发布时间】:2011-01-12 20:39:52
【问题描述】:

我认为提升文件锁定(可共享和作用域文件锁)以及一般文件锁定的一般策略是这样的:

  1. 打开
  2. 对文件内容进行操作
  3. 解锁
  4. 关闭文件

但是,我将打开文件进行追加,并想调用 tellp 来查看我在哪里。在上述情况下这样做安全吗?在锁定之前打开文件后是否会立即设置文件指针,因此可能不受保护?如果是这样,是否有一个标准的成语来解决这个问题?

【问题讨论】:

    标签: c++ c boost file-locking


    【解决方案1】:

    这可能是特定于环境的,但在大多数平台上:

    当打开文件进行追加时,文件指针会在每次写入前立即调整。因此,如果您在锁定文件之前使用tellp,它可能不会告诉您新附加的字节将去哪里,但您不应该有两个使用锁定的进程以某种方式仍然附加相同的字节范围。

    【讨论】:

    • 如果为真,这对我来说仍然有些问题。我曾经担心的是我希望每个人都打开文件进行追加,但是如果你打开文件进行追加并且你在文件的开头,你会写出一个标题。
    • @frankc:那你需要锁定文件,然后调用tellp看是否需要写header。 tellp 在锁定之前没有意义。
    【解决方案2】:

    我推荐好的 boost 文档: http://www.boost.org/doc/libs/1_45_0/doc/html/interprocess/synchronization_mechanisms.html#interprocess.synchronization_mechanisms.file_lock

    您可以在其中阅读:

    • 文件锁不是操作系统锁,即使操作系统支持它(例如 Windows 支持,Unix-like 通常不支持),所以如果你锁定文件,任何人都可以读/写/删除它,除非其他进程使用相同的文件锁定机制。因此,将其更像是进程间互斥锁,而不是真正的文件锁。
    • 文件锁用于进程间同步,它们不会同步进程内的多个线程
    • 不要忘记刷新(ofstream 的刷新),这样就不用担心缓冲了

    哦,这太糟糕了...我想帮忙,我已经编写了示例代码,尝试一下...从 1_44 开始,win32 的文件锁定被破坏,刷新对锁定的文件不起作用。

    对不起,不是我的错。

    如果有帮助,理论上:如果您打开文件进行追加,则意味着在每次写入操作之前自动搜索结束。它不会阻止您随时手动寻求结束 - 即使没有写作。然而,经验(见上文)告诉我们:远离破碎的事物。

    【讨论】:

    • 我知道咨询锁和强制锁的区别,以及线程的限制。这个问题假设这些问题正在解决。
    猜你喜欢
    • 1970-01-01
    • 2012-07-26
    • 2021-09-05
    • 2021-01-15
    • 1970-01-01
    • 2012-05-18
    • 1970-01-01
    • 2017-01-13
    • 2012-10-21
    相关资源
    最近更新 更多