我正在使用Linux aio(io_submit()
/ io_getevents()
)来处理文件I / O.由于某些操作没有aio equilvalents(open()
,fsync()
,fallocate()
),我使用的工作线程可能会阻塞而不会影响主线程。我的问题是,我应该将close()
添加到此列表中吗?
在XFS上使用O_DIRECT
打开所有文件,但我对问题的一般答案以及关于我选择的文件系统和打开模式的具体答案感兴趣。
请注意,使用close()
的工作线程并非易事,因为close()
通常在清理路径中调用,这不是启动工作线程请求并等待它的好地方。所以我希望close()
在这种情况下是非阻塞的。
对于这个问题,"阻止"表示等待I / O操作,或者在I / O操作完成时可能仅释放的某些锁定,但不包括页面错误服务。
答案 0 :(得分:2)
close()
可能会阻止某些文件系统。在可能的情况下,代码应尽可能便携地编写。因此,您绝对应该将close()
添加到仅从阻塞工作线程调用的调用列表中。
但是,您提到您经常需要在清理路径中调用close()
。如果这些是在应用程序终止时执行的清理路径,那么即使close()
在您直接调用它时阻塞,它也可能没有那么大的差别。
或者,您可以做的是将一个队列送到一个工作池。在glibc AIO
中,这是针对许多调用所做的事情。使用aio_init()
初始化AIO时,glibc
会设置队列和工作线程池。每次进行AIO呼叫时,glibc
只会将相关任务和数据添加到队列中。在后台,工作线程在队列上等待并执行阻塞调用和代码,然后执行任何相关操作。
如果您确实需要非阻塞close()
(和其他)调用,那么简单地设置任务队列和线程池并简单地向队列提交特定调用可能对您有利。并让线程池在进入时执行调用。