前提
当不同进程或线程读写同一个文件时,会导致冲突,那么这个时候就需要以独占的方式来读写文件(更好的方法是共享读,互斥写,此处不做讨论)。
问题
查询Qt的帮助文档,发现QLockFile类,该类提供使用文件的进程之间的锁定,比较接近我的要求。
但是用过以后发现QLockFile根本没有继承QIODevice,也没有提供任何文件读写接口。只是在lock()/tryLock()的时候自动生成一个文件,无法对此文件进行读写操作,这就导致了不仅别的进程无法使用此文件,本进程也无法使用此文件(尴尬)!
解决方法
假设我们要以独占的方式来读写“A”文件,那么我们可以通过QLockFile来锁定临时文件“tempA”,读写完“A”文件后,解锁;其它进程在读写“A”文件前,用QLockFile锁“tempA”文件,若锁定成功,则说明此时“A”文件无占用,可以进行读写 ,若锁定失败,在说明有进程在对“A”文件使用,循环等待并再次尝试锁定。
可以把“tempA”文件理解为一个防火墙一样的存在。
示例:
//读写A文件前锁tempA文件
QLockFile lockfile(“tempA”);
while(1){
//若锁定成功,则退出循环,执行下一步;
//若未锁定成功,则说明tempA被其它地方锁住,即代表A文件正在被使用
if(lockfile.tryLock(0)){
break;
}
}
//此处对A文件的读写操作
//。。。。。。
//open file and read/write
//读写A文件完成后解锁tempA文件
while(1){
lockfile.unlock();
if(!lockfile.isLocked()){
break;
}
}
以上方法起到文件锁的作用,虽然实际的“A”文件本身未锁定,但达到了锁的效果!
结尾
只为记录,只为分享! 愿所写能对你有所帮助。不忘记点个赞,谢谢~