当另一个线程正在读/写fd时,我可以调用posix_fadvise吗?

时间:2014-07-30 04:04:37

标签: c++ linux

我在linux下工作一个项目,需要使用多线程读取/写入相同的fd。我想使用posix_fadvise来释放页面缓存。

当另一个线程正在读取或写入相同的fd时,我可以调用posix_fadvise吗?

1 个答案:

答案 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操作要比普通计算慢得多(可能需要很多毫秒)。用互斥锁锁定它们不应该是重要的,并且会给你更多的决定性。