2

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

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

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

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

如果一个文件被一个或多个线程读取(读取可以是并发的),则没有线程可以在该文件上写入。

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

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

4

1 回答 1

2

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

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

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

于 2012-04-21T15:29:29.683 回答