我正在写一个服务器网站。
每个连接都由一个单独的线程提供,因此我事先并不知道线程数。
还有一组文本文件(也不知道数字),每个线程都可以读/写每个文件。
文件一次只能由一个线程写入,但不同的线程可以同时写入不同的文件。
如果一个或多个线程读取文件(读取可以是并发的),则没有线程可以在THAT文件上写入。
现在,我注意到了这个(Thread safe multi-file writing)解决方案,但我还想将函数用作fgets(),例如。
那么,我可以 flock()一个文件,然后使用fgets()或其他stdio读/写库函数吗?
答案 0 :(得分:2)
首先,使用fcntl
,而不是flock
。后者是非标准的,已弃用的BSD函数,不适用于NFS和其他文件系统。另一方面fcntl
锁定是POSIX标准,打算可以在任何地方使用。
现在,如果你想使用与stdio混合的文件级读写器锁定,它将起作用,但你必须小心确保缓冲不会破坏你对锁的假设。我要解释的方法不是唯一的方法,但我相信它是最清晰/最简单的方法:
如果你想使用stdio对你的一个文件进行操作,那么在fopen
之后你应该首先获得正确类型的锁(读或写,也就是独占的共享)。使用fileno
获取文件描述符编号并对其应用锁定。之后,执行整个读取或写入操作。 不要尝试解锁文件;相反,调用fclose
关闭文件,并在文件关闭时隐式解锁。否则,您可以在未缓冲的数据仍然未写入时释放锁定,或者稍后读取在释放锁定之前缓冲的数据,在锁定释放后不再有效。