I am using Root inside a multithreaded Geant4 simulation, and I obtain a strange crash when the dictionary of one of my custom classes is loaded. The dictionary is loaded by two threads concurrently, and using gdb I came to the conclusion that the write lock:
at line 2925 of
TClass.cxx is not respected. I can make the two threads step over it at the same time using the debugger, while I’d expect that the second one should be blocked until the first one releases the lock.
Supposing I’m right, I need help to understand why this happens. It came into my mind that thread-safety in Root might require to be explicitly enabled at runtime (so that the lock mechanisms actually work) or that for using Root in a multithreaded environment it could be necessary to enable some flags at compile time. About the second point, here are the threading-related lines in the cmake output of my build:
-- Looking for pthread.h -- Looking for pthread.h - found -- Looking for pthread_create -- Looking for pthread_create - not found -- Looking for pthread_create in pthreads -- Looking for pthread_create in pthreads - not found -- Looking for pthread_create in pthread -- Looking for pthread_create in pthread - found -- Found Threads: TRUE ... -- Compiler Flags: -g -std=c++14 -Wno-implicit-fallthrough -Wno-noexcept-type -pipe -Wshadow -Wall -W -Woverloaded-virtual -fsigned-char -pthread ... -- Native target architecture is X86 -- Threads disabled. -- Doxygen disabled. -- Go bindings disabled. -- LLVM host triple: x86_64-unknown-linux-gnu -- LLVM default target triple: x86_64-unknown-linux-gnu -- Building with -fPIC -- Constructing LLVMBuild project information -- Linker detection: GNU ld -- SysLibs: rt;dl;tinfo;-lpthread;/usr/lib/libz.so -- Targeting X86 ... -- Enabled support for: asimage builtin_afterimage builtin_clang builtin_davix builtin_gl2ps builtin_llvm builtin_vdt clad dataframe davix exceptions fftw3 fitsio http mathmore mlp minuit2 opengl pgsql roofit runtime_cxxmodules shared sqlite ssl tmva tmva-pymva spectrum vdt x11 xml
-- Threads disabled. line looks suspect, but I really don’t know how to interpret it.
Thanks for any help you might provide.
_ROOT Version: 6.20.00
_Compiler: GCC 10.2.0