我在linux下工作一个项目,需要使用多线程读取/写入相同的fd。我想使用posix_fadvise
来释放页面缓存。
当另一个线程正在读取或写入相同的fd时,我可以调用posix_fadvise
吗?
答案 0 :(得分:1)
阅读posix_fadvise(2)和syscalls(2)。由于posix_fadvise
是真正的syscall(例如,fadvise64
在__NR_fadvise64
中包裹<asm/unistd.h>
,所以你应该可以调用它,而另一个帖子是编写相同的fd,就像你可能有两个线程对同一个文件描述符执行write(2)一样(但那会发生的事情可能是非确定性的)。
我想内核是内部锁定文件描述符引用的内核文件对象。
BTW,posix_advise
的手册页告诉:
Programs can use posix_fadvise() to announce an intention to access file data in a specific pattern in the future, thus allowing the kernel to perform appropriate optimizations.
The advice applies to a (not necessarily existent) region starting at
offset and extending for len bytes (or until the end of the file if
len is 0) within the file referred to by fd. The advice is not
binding; it merely constitutes an expectation on behalf of the
application.
因此我猜内核可能以后跟随posix_fadvise
(或者根本不跟...)
所以我认为你可以做到这一点,但我相信你应该避免,至少出于可读性的原因(以及由于非确定性),让几个线程处理同一个文件描述符。我的感觉是你的代码可能有一些设计问题,但可能会发生一些事情......
通常,我会避免让多个线程在同一个文件描述符上进行I / O(或者至少使用pwrite(2)或使用互斥锁锁定I / O ...)。所以,虽然你可以做你所要求的,但我会避免这样做。
请记住,对磁盘文件系统的I / O操作要比普通计算慢得多(可能需要很多毫秒)。用互斥锁锁定它们不应该是重要的,并且会给你更多的决定性。