代码之家  ›  专栏  ›  技术社区  ›  zildjohn01

是否有任何理由打开具有共享写入权限的文件?

  •  4
  • zildjohn01  · 技术社区  · 15 年前

    我总是以两种方式打开我的文件——读访问和共享读,或者读/写访问和不共享。

    在我看来,允许共享写入可以 总是 导致在读取文件时发生意外事件。在共享写入模式下打开文件有什么好的理由吗?

    3 回复  |  直到 15 年前
        1
  •  2
  •   Sliq    15 年前

    如果一个文件被许多进程共享,那么有时锁定整个文件是不现实的(出于性能原因)。

    在这种情况下,您可以在写入文件时锁定文件的某个区域。

    在Windows中,您可以使用该函数 LockFile() .
    在Linux/Unix中,您可以使用 fcntl() flock()

        2
  •  1
  •   Kevin Pullin    15 年前

    我冒险猜测…它可以用于并行计算。假设有两个线程执行一些高度可并行的计算,并且需要将数据写入单个文件。您还可以预先确定存储每个线程的输出所需的大小(比如50MB)。

    因此,分配一个100MB文件,让线程1从偏移量0开始写入,线程2从50MB开始写入。当线程完成时,您将拥有一个组合文件(否则,使用单独的文件,您需要将线程2的结果附加到线程1)。

    ASCII艺术尝试

     ==============================  
    |      50MB    |     50MB      |   [100 MB Total FileSize]
    |              |               |  
     ==============================  
    ^               ^
    |               |
    Thread 1        Thread 2
    

    尽管如此,我从未这么做过。它甚至可能不起作用!可以想象,您可以使用其他同步机制在线程之间共享文件句柄/流,但随后还必须重置每个线程上的偏移量。也许其中一个效率更高。

    一方面,如果两个线程总是同时写入,则可能会出现大量磁盘抖动。相反,如果写锁上存在大量争用,同步写操作可能会抵消并发性的好处。正如人们常说的,做个侧面的测试!

    无论如何,我也很好奇一个“现实生活”的场景,在这个场景中,共享的写访问已经被使用,并且将关注更多的答案!

        3
  •  1
  •   Paul    15 年前

    低于文件I/O级别的套接字。

    假设一个服务器监听某个本地端口1999,并将入站中继到服务端口3128上的所有订阅客户机。

    服务器可以从多个本地客户机读取数据并中继到多个远程客户机。如果服务器是身份验证守护程序,多个本地应用程序可能会尝试通过同一服务器(服务)进行身份验证。可以通知远程客户端user-x现在已通过身份验证,因为s/he已成功登录到某个应用程序共享身份验证服务器。

    我不知道我在说什么。我在大胆猜测。