我正在处理一种情况,我想为具有多个进程和这些进程中的多个线程的应用程序永久保存状态。通常,这将需要大量使用锁定来确保 没有冲突。
我希望通过使用O_APPEND模式将数据保存到文件中来避免这种情况。只要我确保数据小于4KiB,就可以通过原子方式写入文件。如果我只使用追加数据结构,那么我有一个无锁解决方案。
但是,要使其正常工作,我需要在写入文件后知道文件中数据的位置。我遇到的问题是我找不到写入的系统调用 一个文件,然后告诉我写入文件的偏移量。
我可以使用写命令后再进行查找来发现该位置。然而 如果另一个线程共享相同的文件描述符,这是不安全的,因此需要我使用互斥量来保护写操作,这与我避免锁定的努力背道而驰。
在检查手册页中的write,writev,pwrite和prwritev时,没有显示任何可以执行写操作的内容,然后作为单个系统调用告诉我写操作后的偏移量,我完全知道可能没有。我看过东西了吗?
答案 0 :(得分:0)
如果我仅使用追加数据结构,那么我有一个无锁解决方案。
当代码为常规文件调用write
时,内核要做的第一件事是获取文件读写信号量。您所有的编写线程都在内核中的该信号量上序列化。
请参见vfs_write
,它调用file_start_write
并最终获得信号量。