- 论坛徽章:
- 2
|
本帖最后由 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. 是否还有更合理、更有效互斥方案 ?
谢谢。 |
|