免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1607 | 回复: 2
打印 上一主题 下一主题

[系统] 实现一个文件单实例(互斥)写入时遇到的问题 [复制链接]

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-01-20 13:49 |只看该作者 |倒序浏览
本帖最后由 hitcser01 于 2015-01-20 13:59 编辑

Hi,各位前辈、朋友,请教一个问题。

背景:
Linux/C++(用C解决也好),对于某个文件F,可能同时有多个进程(没有父子进程关系),每个进程之内又有多个线程会试图写该文件,即进程间有竞争,进程内的多个线程也有竞争。
每个进程都会先new 1个对象,调用该对象的定时任务(线程)写文件,也可能会new 多个对象,多个对象可能关联到同一个文件F,导致一个进程内有多个线程竞争写文件F.

获取锁失败直接返回错误即可,无需阻塞等待解锁。
写入的数据量较小,不超过几十MB,绝大部分情况下是KB级。

现在的办法:
每个线程写文件F前,先通过 open(..., O_WRONLY | O_CREAT | O_EXCL) 来创建一个文件 F.Lock 用于互斥锁,
根据man 2 open,如果 F.lock 已经存在,则获取锁失败,返回;否则获取锁成功,可以继续写文件F,写完后 unlink F.Lock 释放锁。


遇到的障碍:
如果某个进程P,创建出 F.Lock 后崩溃,没来得及删除 F.Lock ,会导致其它进程、线程都无法再写文件F。

那么问题是:
1. 怎样合理有效地清理 F.Lock ?
清理 F.Lock 时要考虑其它线程已经通过F.Lock拿到互斥权在写文件F,直接删除会导致另一个线程 open(..., O_WRONLY | O_CREAT | O_EXCL)  成功继而有多个线程竞争写文件。

2. 是否还有更合理、更有效互斥方案 ?

谢谢。

论坛徽章:
4
水瓶座
日期:2013-09-06 12:27:30摩羯座
日期:2013-09-28 14:07:46处女座
日期:2013-10-24 14:25:01酉鸡
日期:2014-04-07 11:54:15
2 [报告]
发表于 2015-01-20 16:00 |只看该作者
多进程互斥似乎没有完美方案,给你一个建议就是dump临时文件后rename覆盖上去,这样是绝对不会出现并发写错的问题。

论坛徽章:
2
嗜杀者
日期:2015-11-25 10:44:3015-16赛季CBA联赛之北京
日期:2016-03-20 19:50:17
3 [报告]
发表于 2015-01-20 16:50 |只看该作者
回复 2# linux_c_py_php

谢谢建议,又提供了一个全新的思路。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP