Использование HDF5 Thread Safe Library

У меня есть вопрос, касающийся использования библиотеки HDF5 Thread Safe.
В настоящее время я работаю с экземпляром библиотеки 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:\Projects\CANoe\90\CMake-hdf5-1.8.16\hdf5-1.8.16\src\H5D.c line 358 in H5Dopen2(): not found
major: Dataset
minor: Object not found
#001: D:\Projects\CANoe\90\CMake-hdf5-1.8.16\hdf5-1.8.16\src\H5Gloc.c line 430 in H5G_loc_find(): can't find object
major: Symbol table
minor: Object not found
#002: D:\Projects\CANoe\90\CMake-hdf5-1.8.16\hdf5-1.8.16\src\H5Gtraverse.c line 861 in H5G_traverse(): internal path traversal failed
major: Symbol table
minor: Object not found
#003: D:\Projects\CANoe\90\CMake-hdf5-1.8.16\hdf5-1.8.16\src\H5Gtraverse.c line 596 in H5G_traverse_real(): can't look up component
major: Symbol table
minor: Object not found
#004: D:\Projects\CANoe\90\CMake-hdf5-1.8.16\hdf5-1.8.16\src\H5Gobj.c line 1139 in H5G__obj_lookup(): can't check for link info message
major: Symbol table
minor: Can't get value
#005: D:\Projects\CANoe\90\CMake-hdf5-1.8.16\hdf5-1.8.16\src\H5Gobj.c line 333 in H5G__obj_get_linfo(): unable to read object header
major: Symbol table
minor: Can't get value
#006: D:\Projects\CANoe\90\CMake-hdf5-1.8.16\hdf5-1.8.16\src\H5Omessage.c line 896 in H5O_msg_exists(): unable to release object header
major: Object header
minor: Unable to unprotect metadata
#007: D:\Projects\CANoe\90\CMake-hdf5-1.8.16\hdf5-1.8.16\src\H5O.c line 1963 in H5O_unprotect(): unable to release object header
major: Object header
minor: Unable to unprotect metadata
#008: D:\Projects\CANoe\90\CMake-hdf5-1.8.16\hdf5-1.8.16\src\H5Gobj.c line 1524 in H5O_msg_exists(): H5G__obj_get_linfo
major: Object cache
minor: Unable to unprotect metadata
#009: D:\Projects\CANoe\90\CMake-hdf5-1.8.16\hdf5-1.8.16\src\H5C.c line 5281 in H5C_unprotect(): Entry already unprotected??
major: Object cache
minor: Unable to unprotect metadata

Я подозреваю, что это происходит потому, что сама библиотека не является потокобезопасной в ее текущей форме.

Мой вопрос сейчас:
Если бы я перекомпилировал библиотеку, используя опцию —enable-threadsafe, я бы смог работать с файлом HDF5, как я это делал выше.
Сама библиотека, чем должна гарантировать, что только один поток одновременно обращается к файлу (или выполняет вызов API), верно?
И если я перекомпилирую библиотеку, смогу ли я использовать C ++ API?

Я также пытался заблокировать вызовы API с помощью мьютекса, но у меня все еще были некоторые проблемы с ним.

Я был бы очень благодарен, если бы кто-то здесь мог дать мне ответ на мою проблему.
Я надеюсь, что объяснил себя достаточно хорошо. Извините, если это стало немного долго;).

Заранее спасибо.

1

Решение

В соответствии с HDF5 документация, он обеспечивает первый уровень безопасности потока при компиляции с —enable-threadsafe. Но это верно только для библиотеки C. Высокоуровневая библиотека C ++ не поддерживает безопасность потоков. Если вы попытаетесь запустить

./configure --enable-threadsafe --enable-cxx

вы получите ошибку.
Итак, если вы хотите использовать C ++, вы должны скомпилировать hdf5 без--enable-threadsafe«и вы никогда не должны получать доступ к библиотеке hdf5 из разных потоков одновременно. По моему опыту, лучше обращаться к HDF5 всегда из одного и того же потока в C ++.

Некоторые дистрибутивы Linux применяют патч, который «исправляет» это ограничение, позволяя обоим --enable-threadsafe а также --enable-cxx, эффективно ломая библиотеку C ++. Более новая версия libhdf5 даже имеет опцию --enable-unsupported, что позволит без патча. Вы получите случайные сбои, используя такой «улучшенный«Пакет hdf5. Итак, проверьте, не получили ли вы такого»улучшенныйmsgstr «библиотека и перекомпилируйте его вручную, если необходимо

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]