有没有理由打开具有共享写访问权限的文件?

时间:2009-06-06 00:38:31

标签: file-io file-access file-sharing

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

对我而言,似乎允许共享写入始终会导致文件在您阅读时发生意外情况。有没有充分的理由在共享写入模式下打开文件?

3 个答案:

答案 0 :(得分:2)

如果某个文件被许多进程共享,则锁定整个文件有时是不切实际的(出于性能原因)。

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

在Windows中,您可以使用LockFile()功能 在Linux / Unix中,您可以使用fcntl()flock()

答案 1 :(得分:1)

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

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

ASCII艺术尝试

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

所有这一切,我从来没有这样做过。它可能甚至不起作用!您可以想象只使用其他同步机制共享线程之间的文件句柄/流,但是您还必须重置每个线程上的偏移量。也许一个或另一个更有效率。

一方面,如果两个线程总是写simeltanouesly,可能会有很多磁盘颠簸。相反,如果写锁定存在大量争用,则同步写入可能会抵消并发的好处。正如常说的那样,简介和测试!

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

答案 2 :(得分:1)

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

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

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

我不知道我在说什么。我冒昧地猜测。