Hi Nathaniel,
what you can do is instantiate one or more TFile per thread and have each thread read/write to its thread-local TFile(s).
Using the same TFile from different threads, even protecting concurrent access with a mutex, as well as creating a TFile in one thread and using it from another, can result in quirky behavior.
Multi-thread parallelism in ROOT can be very tricky, due to the large amount of global state that it relies on and that is implicitly modified by object constructors, destructors and other methods.
Please ask if you have any further doubts.
Also consider using implicit parallelism if that’s an option for your usecase.
Hope this helps,
Enrico