使用flock,打开和关闭文件来实现许多读者单个编写器锁

时间:2015-11-02 20:20:38

标签: c multithreading locking flock

我有一个项目,包含多个可以读取或写入单个数据库的进程。我希望使用系统调用flock / open / close来实现由锁定文件同步的单个写入器/多读取器锁。

一旦锁定失败,任何再次尝试再次锁定的操作都将由请求锁定的更高级别进行(与自旋锁定不同)。

不幸的是,在测试此模型时,它在解锁之前没有锁定的情况下失败。 也许你可以帮我找到我在这里做错了什么:

--orphan

1 个答案:

答案 0 :(得分:2)

lock_readlock_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绊倒时,你就会有罪魁祸首。