diff --git a/Modules/IO/ImageBase/src/itkImageIOFactory.cxx b/Modules/IO/ImageBase/src/itkImageIOFactory.cxx index 0e1694f5d43..564839948b3 100644 --- a/Modules/IO/ImageBase/src/itkImageIOFactory.cxx +++ b/Modules/IO/ImageBase/src/itkImageIOFactory.cxx @@ -34,20 +34,26 @@ ImageIOFactory::CreateImageIO(const char * path, IOFileModeEnum mode) { std::list possibleImageIO; - const std::lock_guard lockGuard(createImageIOMutex); - - for (auto & allobject : ObjectFactoryBase::CreateAllInstance("itkImageIOBase")) { - auto * io = dynamic_cast(allobject.GetPointer()); - if (io) - { - possibleImageIO.emplace_back(io); - } - else + // Lock the mutex while creating all instances of ImageIOBase, to + // ensure thread safety during intialization of third-party libraries. + const std::lock_guard lockGuard(createImageIOMutex); + + for (auto & allobject : ObjectFactoryBase::CreateAllInstance("itkImageIOBase")) { - std::cerr << "Error ImageIO factory did not return an ImageIOBase: " << allobject->GetNameOfClass() << std::endl; + auto * io = dynamic_cast(allobject.GetPointer()); + if (io) + { + possibleImageIO.emplace_back(io); + } + else + { + std::cerr << "Error ImageIO factory did not return an ImageIOBase: " << allobject->GetNameOfClass() + << std::endl; + } } } + for (auto & k : possibleImageIO) { if (mode == IOFileModeEnum::ReadMode)