【问题标题】:concurrent access to file linux并发访问文件linux
【发布时间】:2013-01-14 01:21:18
【问题描述】:

我正在研究如何在 linux 中完成系统调用读/写,我发现了这个:

....
loff_t pos = file_pos_read(f.file);
ret = vfs_read(f.file, buf, count, &pos);
file_pos_write(f.file, pos);
fdput(f);
...`

我的问题是:

锁定去了哪里?我会想象这样的事情:

....
lock(f.file);  // <-- lock file struct
loff_t pos = file_pos_read(f.file);
ret = vfs_read(f.file, buf, count, &pos);
file_pos_write(f.file, pos);
fdput(f);
unlock(f.file);  // <-- unlock file struct
...

如果多个线程同时尝试读/写,它们可以在相同的偏移量上读/写?

如果我的理解是正确的,linux没有使用任何锁定机制来保护偏移量,这是否符合POSIX?

我确实查看了 POSIX 规范,但没有发现任何关于此案例的信息。

【问题讨论】:

标签: c linux multithreading concurrency filesystems


【解决方案1】:

Linux 不使用任何锁定机制来保护多线程写入文件。

您必须使用自己的互斥锁来保护您的文件。

【讨论】:

  • 这是posix指定的吗?所有的 UNIX 内核都做同样的事情吗?
【解决方案2】:

在多线程应用程序中,您有责任序列化对文件描述符的访问。您可以跨进程使用flock(2) 系统调用来同步对同一文件的访问。

如果您从两个不同的进程/线程访问同一个文件,内核不会崩溃,但它可能会以未定义的方式覆盖或损坏文件位置和文件数据。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-04-02
    • 2014-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-16
    • 1970-01-01
    相关资源
    最近更新 更多