使用HDF5线程安全库
Using HDF5 Thread Safe Library
我有一个关于HDF5线程安全库使用的问题
我目前使用的是HDF5 C++库(静态)的一个实例,它是由我的一位同事使用"HDF5_ENABLE_PARALLEL"
和"HDF5_ENABLE_THREADSAFE"
选项编译的。
我试图做的是使用多个线程访问包含一些数据的HDF文件。数据的实际读取不需要并行。
我的代码目前看起来简化如下:
// includes etc.
int main() {
H5File t_file(FILENAME, H5F_ACC_RDONLY);
thread t1(read_row, cref(t_file), 0);
thread t2(read_row, cref(t_file), 1);
t1.join();
t2.join();
return 0;
}
void read_row(const H5File & p_file, size_t p_row){
double data[DIM_Y][DIM_X];
try {
DataSet t_dataset = p_file.openDataSet("/Group0/Set0");
DataSpace t_dataspace = t_dataset.getSpace();
hsize_t dims[2];
auto status = t_dataspace.getSimpleExtentDims(dims, nullptr);
hsize_t count[2] = { 1, DIM_X };
hsize_t offset[2] = { p_row, 0 };
t_dataspace.selectHyperslab(H5S_SELECT_SET, count, offset);
hsize_t mem_dim[2] = { 1, DIM_X };
DataSpace t_memspace(RANK, mem_dim);
hsize_t mem_offset[2] = { 0, 0 };
t_memspace.selectHyperslab(H5S_SELECT_SET, count, mem_offset);
t_dataset.read(data, PredType::NATIVE_DOUBLE, t_memspace, t_dataspace);
}
catch (...){
cout << "Caught some exception" << endl;
}
}
代码会编译,如果我大部分时间都运行程序,一切都会很顺利
然而,有时我会收到以下错误消息:
HDF5-DIAG: Error detected in HDF5 (1.8.16) thread 0:
#000: D:ProjectsCANoe90CMake-hdf5-1.8.16hdf5-1.8.16srcH5D.c line 358 in H5Dopen2(): not found
major: Dataset
minor: Object not found
#001: D:ProjectsCANoe90CMake-hdf5-1.8.16hdf5-1.8.16srcH5Gloc.c line 430 in H5G_loc_find(): can't find object
major: Symbol table
minor: Object not found
#002: D:ProjectsCANoe90CMake-hdf5-1.8.16hdf5-1.8.16srcH5Gtraverse.c line 861 in H5G_traverse(): internal path traversal failed
major: Symbol table
minor: Object not found
#003: D:ProjectsCANoe90CMake-hdf5-1.8.16hdf5-1.8.16srcH5Gtraverse.c line 596 in H5G_traverse_real(): can't look up component
major: Symbol table
minor: Object not found
#004: D:ProjectsCANoe90CMake-hdf5-1.8.16hdf5-1.8.16srcH5Gobj.c line 1139 in H5G__obj_lookup(): can't check for link info message
major: Symbol table
minor: Can't get value
#005: D:ProjectsCANoe90CMake-hdf5-1.8.16hdf5-1.8.16srcH5Gobj.c line 333 in H5G__obj_get_linfo(): unable to read object header
major: Symbol table
minor: Can't get value
#006: D:ProjectsCANoe90CMake-hdf5-1.8.16hdf5-1.8.16srcH5Omessage.c line 896 in H5O_msg_exists(): unable to release object header
major: Object header
minor: Unable to unprotect metadata
#007: D:ProjectsCANoe90CMake-hdf5-1.8.16hdf5-1.8.16srcH5O.c line 1963 in H5O_unprotect(): unable to release object header
major: Object header
minor: Unable to unprotect metadata
#008: D:ProjectsCANoe90CMake-hdf5-1.8.16hdf5-1.8.16srcH5Gobj.c line 1524 in H5O_msg_exists(): H5G__obj_get_linfo
major: Object cache
minor: Unable to unprotect metadata
#009: D:ProjectsCANoe90CMake-hdf5-1.8.16hdf5-1.8.16srcH5C.c line 5281 in H5C_unprotect(): Entry already unprotected??
major: Object cache
minor: Unable to unprotect metadata
我怀疑发生这种情况是因为库本身在当前形式下不是线程安全的
我现在的问题是:
如果我使用--enable threadsafe选项重新编译库,那么我就可以像上面那样使用HDF5文件了
库本身应该确保一次只有一个线程访问文件(或者正在执行API调用),对吗
如果我重新编译这个库,我还能使用C++API吗?
我还试着用互斥锁来锁定API调用,但还是有一些问题
如果这里有人能给我一个问题的答案,我将不胜感激。我希望我解释得足够好。抱歉,如果时间有点长;)。
提前谢谢。
根据HDF5文档,当使用--enable threadsafe编译时,它提供了第一级的线程安全性。但这只适用于C库。高级C++库不支持线程安全。如果您将尝试运行
./configure --enable-threadsafe --enable-cxx
你会得到一个错误。所以,如果你想使用C++,你必须在没有"--enable-threadsafe
"选项的情况下编译hdf5,并且你永远不应该同时从不同的线程访问hdf5库。根据我的经验,最好总是从C++中的同一个线程访问HDF5。
一些Linux发行版应用了一个补丁,通过同时允许--enable-threadsafe
和--enable-cxx
来"修复"这一限制,从而有效地破坏了C++库。libhdf5的新版本甚至有一个选项--enable-unsupported
,这将允许它在没有补丁的情况下运行。使用这样一个"改进"的hdf5软件包,您将获得随机崩溃。因此,请检查您是否没有得到这样一个"改进的"库,并在需要时手动重新编译它。
- 从不同线程使用int64的不同字节安全吗
- 如何将元素添加到数组的线程安全函数?
- C++中的线程安全删除
- 在std::thread中,joinable()然后join()线程安全吗
- 在c++队列中使用pop和visit实现线程安全
- 以线程安全的方式调用"QQuickPaintedItem::updateImage(const QImage&image)"(no QThread)
- 全局变量 多读取器 一个写入器多线程安全?
- 共享队列的线程安全
- boost::文件系统::recursive_directory_iterator多线程安全
- 静态 constexpr 类成员变量对多线程读取是否安全?
- 以线程安全的方式转换 C/C++ 中时区名称字符串的时区偏移量
- 线程安全运算符<<
- 如何使缓存线程安全
- C++线程安全:如果只有一个线程可以写入非原子变量,但多个线程从中读取. 会遇到问题吗?
- 提升精神 V2 Qi 语法线程安全吗?
- 线程调用的函数对对象删除是否安全?
- asio 链对象线程安全吗?
- 线程安全队列 c++
- 提供对不同类型的数据(建议、代码审查)的线程安全访问的类
- 有没有更好的方法可以使此代码线程安全?线程局部静态似乎是一个生硬的工具