C - flock(),然后是 fgets():低级锁,然后是 stdio 读/写库函数.可能吗



我正在编写一个服务器网络。

每个连接都由一个单独的线程提供服务,所以我事先不知道线程的数量

还有一组文本文件(也不知道数字),每个线程都可以对每个文件进行读/写。

一个文件

一次只能由一个线程写入,但不同的线程可以同时写入不同的文件。

如果文件由一个或多个线程读取(读取可以是并发的),则任何线程都不能写入该文件。

现在,我注意到了这个(线程安全的多文件写入)解决方案,但我也想使用函数作为 fgets(),例如。

那么,我可以 flock() 一个文件,然后使用 fgets() 或其他 stdio 读/写库函数吗?

首先,使用 fcntl ,而不是 flock 。后者是一个非标准的、已弃用的 BSD 函数,不适用于 NFS 和可能的其他文件系统。 另一方面,fcntl锁定是 POSIX 标准,旨在适用于任何地方。

现在,如果您想将文件级读写器锁定与 stdio 混合使用,它将起作用,但您必须注意确保缓冲不会破坏您对锁的假设。我将要解释的方法不是唯一的方法,但我相信它是最清晰/最简单的:

当您想使用 stdio 对其中一个文件进行操作时,获取正确类型的锁(读取或写入,也称为独占共享)应该是您在fopen之后要做的第一件事。使用 fileno 获取文件描述符编号并对其应用锁。之后,执行整个读取或写入操作。不要尝试解锁文件;相反,调用 fclose 关闭文件,并在关闭时隐式解锁文件。否则,您可以在未缓冲的数据仍未写入时释放锁,或者稍后读取在释放锁之前缓冲的数据,这些数据在释放锁后不再有效。

相关内容

最新更新