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