我有一个项目,包含多个可以读取或写入单个数据库的进程。我希望使用系统调用flock / open / close来实现由锁定文件同步的单个写入器/多读取器锁。
一旦锁定失败,任何再次尝试再次锁定的操作都将由请求锁定的更高级别进行(与自旋锁定不同)。
不幸的是,在测试此模型时,它在解锁之前没有锁定的情况下失败。 也许你可以帮我找到我在这里做错了什么:
--orphan
答案 0 :(得分:2)
在lock_read
和lock_write
中,将此添加为第一行:
assert ((read_descriptor == 0) && (write_descriptor == 0));
在unlock_read
中,添加以下内容:
assert (read_descriptor != 0);
在unlock_write
中添加以下内容:
assert (write_descriptor != 0);
更改代码如:
if(flock(read_descriptor, LOCK_SH)<0) {
close(read_descriptor);
return LOCK_FAIL;
}
为:
if(flock(read_descriptor, LOCK_SH)<0) {
close(read_descriptor);
read_descriptor = 0;
return LOCK_FAIL;
}
对写入代码执行相同操作,以便在描述符关闭时,相应的全局设置为零。 (你真的应该使用-1作为无效的文件描述符,因为零是合法的。)
进行调试构建并运行它。当assert
绊倒时,你就会有罪魁祸首。