高级IO——文件锁

Posted kelamoyujuzhen

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了高级IO——文件锁相关的知识,希望对你有一定的参考价值。

文件锁也被称为记录所,文件锁如果深讲的话,内容不少(比如文件锁最起码分为了建议锁和强制性锁,暂时挖坑,后面填)。

文件锁作用

顾名思义,就是用来保护文件数据的。当多个进程共享读写同一个文件时,为了不让进程们各自读写数据时相互干扰,我们可以使用进程信号量来互斥实现,除了可以使用进程信号量以外,还可以使用我们本小节要讲的“文件锁”来实现,而且功能更丰富,使用起来相对还更容易些。

多进程读写文件

 

技术分享图片

多进程共享读写同一个文件时,如果数据很重要的话,为了防止数据相互修改,应该满足如下读写条件:

①写与写应该互斥

当某个进程正在写文件,而且在数据没有写完时,其它进程不能写,否者会相互打乱对方写的数据。

②读与写也应该是互斥的

分两种情况:

1)某个进程正在写数据,而且在数据没有写完时,其它进程不能读数据。因为别人在没有写完之前,读到的数据是不完整的,所以读和写时互斥的。

2)某个进程正在读数据,在数据没有读完之前,其它进程不能写数据。因为可能会扰乱别人读到的数据。

③读与读共享

某个进程在读数时,就算数据没有读完,其它进程也可以共享读数据,并不需要互斥等别人读完后才能读。因为读文件是不会修改文件的内容,所以不用担心数据相互干扰的问题。

总结起来就是,多进程读写文件时,如果你想进行资源保护的话,完美的资源保护应该满足如下这样的。

1)写与写之间互斥

2)读与写之间互斥

3)读与读之间共享

如何实现以上读写要求?

如果使用信号量来实现保护的话,只能是一律互斥,包括读与读都是互斥的,不能够向上面描述的,既能互斥又能共享,但是文件锁可以做到。

文件锁的读锁与写锁

对文件加锁时可以加两种锁,分别是“读文件锁”和“写文件锁”,我们这里简称为读锁和写锁。

读锁、写锁之间关系

①读锁和读锁共享:可以重复加读锁,别人加了读锁在没有解锁之前,我依然可以加读锁,这就是共享。

②读锁与写锁互斥:别人加了读锁没有解锁前,加写锁会失败,反过来也是如此。

加锁失败后两种处理方式,

(1)阻塞,直到别人解锁然后加锁成功为止

(2)出错返回,不阻塞

③写锁与写锁互斥:别人加了写锁在没有解锁前,不能加写锁,加写锁会失败。

加锁失败后两种处理方式,

(1)阻塞,直到别人解锁然后加锁成功为止

(2)出错返回,不阻塞

使用文件锁对文件进行保护

读文件时加读锁,写文件时就加写锁,然后就可以很容易的实现符合如下要求的资源保护。

1)写与写之间互斥

2)读与写之间互斥

3)读与读之间共享

技术分享图片

 

以上是关于高级IO——文件锁的主要内容,如果未能解决你的问题,请参考以下文章

Java新IO_文件锁代码 与字符集

APUE:高级I/O

读写文件的锁实例

SQLite剖析之异步IO模式共享缓存模式和解锁通知

Apue学习:高级I/O

IOS面试题(多线程) --- 锁