我正在使用自动回收设施(垃圾收集)的解释语言实现HDF5层。
当不再引用HDF5实体的代理(H5File,H5Group,H5Dataset,H5Dataspace,H5Datatype等...)时,它将自动回收。使用ephemeron like facility,我可以安排注意并自动调用相应的close函数(H5Fclose,H5Gclose,H5Dclose等...)以释放目标资源。
默认情况下,我无法控制回收的顺序。但是,如果有关闭计数的顺序,那么我可以安排在任何其他实体内的父代理(例如H5文件)上保留一个强指针。如果订单不计算,那么我将避免这种无用的并发症。
所以我的问题:
我可以在之前H5Fclose(fid);
的{{1}}之前调用H5Gclose(gid);
吗?
关闭包含文件后,我可以继续对该组进行操作吗?例如,在上面的示例中,gid=H5Gcreate(fid,'/foo',H5P_DEFAULT, H5P_DEFAULT, H5P_DEFAULT);
之前调用H5Fclose(fid);
是否合法?如果没有,是否有其他相关实体,或者只是文件?
答案 0 :(得分:0)
Doh,失明的情况下,文件告诉关闭被延迟,直到所有物品都被关闭,所以1.订单不计算,2。是合法的。
https://support.hdfgroup.org/HDF5/doc1.6/RM_H5F.html#File-Close
但是,它可能不适用于所有情况,因此不建议这样做。
H5Fclose通过将所有数据刷新到存储并通过file_id终止对文件的访问来终止对HDF5文件的访问。
如果这是为文件打开的最后一个文件标识符,并且没有打开其他访问标识符(例如,数据集标识符,组标识符或共享数据类型标识符),则文件将完全关闭,访问将结束。
延迟关闭: 请注意以下与上述行为的偏差。如果为文件调用H5Fclose但文件中的一个或多个对象保持打开状态,那么这些对象将保持可访问状态,直到它们被单独关闭。因此,如果在为包含它的文件调用H5Fclose时打开数据集data_sample,则data_sample将保持打开并可访问(包括可写),直到明确关闭为止。一旦文件中的所有对象都关闭,文件将自动关闭。
但是,请注意,在某些情况下无法延迟关闭文件。例如,MPI-IO文件关闭是一个集体调用;打开文件的所有进程必须共同关闭它。每个进程都可以以独立的方式在将来的某个时间关闭该文件。另一个示例是,在H5Fclose成功返回后,使用基于AFS令牌的文件访问权限的应用程序可能会破坏其AFS令牌。这将使得将来访问该文件或其中的任何对象是非法的。
在这种情况下,应用程序必须在调用H5Fclose之前关闭文件中的所有打开对象。通常建议在所有情况下都这样做。